Каталог статей

Главная » Статьи » Мои статьи

Singleton для Qt

Иногда при разработке приложений возникает потребность в существовании некоего объекта, который должен быть доступен из многих, совершенно разных частей программы. Примером такого объекта может служить общий контейнер внутренней конфигурации программы. Кроме того, ключевой особенностью такого объекта является единственность его существования – к примеру, объект, работающий с определенным COM портом должен существовать в единственном экземпляре.

Таким образом, мы можем выделить две особенности объекта типа Singleton:

  • Доступность объекта из различных частей программы
  • Единственность существования

Специально выделяю вторую особенность, дабы подчеркнуть суть такого объекта. Первая особенность – просто «полезность», вытекающая из единственности. На практике, эти две особенности идут рядом, поэтому я не буду разделять их детали реализации.

Да, вопрос об обоснованности существования таких объектов и т.п. – это совсем другая тема и философия проектирования. Но мы сейчас не об этом.

Существует несколько подходов к реализации таких объектов. Я предлагаю один из них, которым пользуюсь уже на протяжении многих лет.


01//--------------------------------------------------------------------------
02// File: a_singleton.h
03//
04// Desc: An one-instance class
05//--------------------------------------------------------------------------
06 
07#ifndef A_SINGLETON_H
08#define A_SINGLETON_H
09 
10#include <QtGlobal>
11 
12// disable the warning regarding 'this' pointers being used in
13// base member initializer list. Singletons rely on this action
14#pragma warning(disable : 4355)
15 
16//--------------------------------------------------------------------------
17// Name: uSingleton
18// Desc: A singleton is a type of class of which only one instance may
19//      exist. This is commonly used for management classes used to
20//      control system-wide resources.
21//--------------------------------------------------------------------------
22template <class T>
23class uSingleton
24{
25public:
26 
27    // the singleton must be constructed with a reference to the controlled object
28    //----------------------------------------------------------------------
29    uSingleton(T& rObject)
30    {
31        Q_ASSERT_X(!s_pInstance, "constructor", "Only one instance of this class is permitted.");
32        s_pInstance = &rObject;
33    }
34 
35    // the singleton accessor
36    //----------------------------------------------------------------------
37    ~uSingleton()
38    {
39        Q_ASSERT_X(s_pInstance, "destructor", "The singleton instance is invalid.");
40        s_pInstance = 0;
41    }
42 
43    // the singleton accessor
44    //----------------------------------------------------------------------
45    static T& instance()
46    {
47        Q_ASSERT_X(s_pInstance, "instancing", "The singleton has not yet been created.");
48        return (*s_pInstance);
49    }
50 
51private:
52    // Data...
53    //----------------------------------------------------------------------
54    static T* s_pInstance;
55 
56    // Nonexistant Functions...
57    //----------------------------------------------------------------------
58    uSingleton(const uSingleton& Src);
59    uSingleton& operator=(const uSingleton& Src);
60 
61};
62template <class T> T* uSingleton<T>::s_pInstance = 0;
63 
64#endif // A_SINGLETON_H

Объявление класса:


01//--------------------------------------------------------------------------
02// File: usingletonuserclass.h
03//--------------------------------------------------------------------------
04 
05#ifndef USINGLETONUSERCLASS_H
06#define USINGLETONUSERCLASS_H
07 
08#include <QObject>
09 
10#include "a_singleton.h"
11 
12// Defines for geting instance
13class MyClass;
14#define MY_CLASS MyClass::instance()
15 
16//--------------------------------------------------------------------------
17// Name: MyClass
18//--------------------------------------------------------------------------
19class MyClass : public QObject, public uSingleton<MyClass>
20{
21    Q_OBJECT
22 
23public:
24    explicit MyClass(QObject* parent = 0);
25 
26    // Test function to show work with singleton
27    void testFunc() {};
28};
29 
30#endif // USINGLETONUSERCLASS_H

Не забудьте инициализировать синглетон в конструкторе:


01//--------------------------------------------------------------------------
02// MyClass singleton constructor
03//--------------------------------------------------------------------------
04MyClass::MyClass(QObject *parent)
05    : QObject(parent), uSingleton<MyClass>(*this)
06{
07    /*
08      ...
09    */
10}

Теперь доступ к объекту класса производится простым и понятным путем:


1// ...
2MY_CLASS.testFunc();
3// ...


Источник: http://ufna.ru/2010/04/24/singleton-for-qt
Категория: Мои статьи | Добавил: qt-boy (12.08.2010)
Просмотров: 3009 | Комментарии: 3 | Теги: Singleton для Qt | Рейтинг: 0.0/0 |
Всего комментариев: 1
1 Автор  
0
Если уж копируете статью с сильной потерей форматирования, ссылку на источник помещайте в начало.

ufna


Имя *:
Email *:
Код *:
Форма входа
3D Облако
Мини-чат
Категории раздела
Мои статьи [19]
Облако
About Qt QList Qtractor 0.4.2 QListView git-репозиторий Qt Жасмин Бланшет QtCreator 1.1 Qt Extended Qt Solutions Динамическое приведение QObject библиотеки Qt 4.5.1 Пишем собственный веб броузер QFileDialog QMessageBox Добавление информации о версии в .e Вышли бета-версии библиотеки Qt 4.7 Qt qt quick qt sdk qtcreator Singleton для Qt QInputDialog QColorDialog Примеры использования класса QEvent QFontDialog QFileSystemWatcher следим за директ GIf Анимация в QLabel Открытие ссылки в браузере установл Открытие ссылки в браузере установл Добавление итемов в QTableWidget QMap итератор Помещаем окно посередине экрана Выставляем флаги для окон Отловить нажатие клавиши на QLabel Отловить нажатие клавиши на QLabel Определить какой именно контрол был Показать на время курсор с песочным Сделать окно модальным Зашифровать данные в MD5 или MD4 Удаление из QlistWidget строки Написание DLL на С++ Диалог открытия файла Работа с реестром Ограничение на ввод определенного к QMessageBox подтверждение удаления Многопоточный сервер на примере Чат Отправляем файл на PHP скрипт Пример пересылки от клиента к серве Алгоритм сортировки (не очень оптим но если не важна скорость то сойдет Вставка текста из буфера обмена(при Проверить существует ли файл Распечатка текста из QTextEdit Вывести текст из QTextEdit в диалог Интересное о QFileInfo Отловить событие закрытие окна Проверка веб ссылки на валидность Иконка для QPushButton Преобразовать QString в char* Выдрать IP и порт из строки Получение списка всех файлов в дире Окно поверх всех Ввод пароля в QLineEdit Ввод в QLineEdit только цифр и точк Скачать файл по Ftp Пример использования оператора fore Пример использования класса QDir Получить список папок Кодирование/Декодирвоание Base64 Получить переменные среды Оставить у диалога только кнопку за Запуск сторонней программы из Qt ис Drop Добавление эффекта выделяющего прям Получение информации о свободном пр Запись структуры(пользовательского Получение информации о свободном ди Простой пример использования QProce Как унаследоваться от QObject Отрисовать виджет по форме картинки Перемещение виджета вслед за мышкой Сделать диалог поверх всех окон/поз Повернуть изображение QSignalMapper - как пользоваться Qt приведение типа QFileSystemWatcher следим за директ Добавление сигнала clicked() в QLab Рекурсивный поиск файлов и папок QWheelEvent определить направление Отловить завершение работы системы Валидация на ввод только цифр styleSheet QLabel красим текст под styleSheet QLabel простой пример styleSheet QTableWidget красим заго styleSheet QTableWidget красим QTab QTableWidgetItem текст по центу Проверка сокета Выход из вложенных циклов styleSheet QPushButton выравнивание
Наш опрос
Оцените мой сайт
Всего ответов: 91
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0