Одиночка — порождающий шаблон проектирования, гарантирующий что в однопоточном приложении будет единственный экземпляр класса с глобальной точкой доступа.

Создаем новый заголовочный файл, например usingleton.h

Сам код:

#ifndef USINGLETON_H
#define USINGLETON_H

#include <QtGlobal>
//#pragma warning(disable : 4355)

template <class T>
class uSingleton {
public:
    uSingleton(T& rObject) {

        Q_ASSERT_X(!s_pInstance, "constructor", "Only one instance of this class is permitted.");
        s_pInstance = &rObject;
    }
    ~uSingleton() {
        Q_ASSERT_X(s_pInstance, "destructor", "The singleton instance is invalid.");
        s_pInstance = 0;
    }
    static T& instance() {
        if(!s_pInstance) {
                   s_pInstance = new T();
        }
        //Q_ASSERT_X(s_pInstance, "instancing", "The singleton has not yet been created.");
        return (*s_pInstance);
    }
private:
    static T* s_pInstance;
    uSingleton(const uSingleton& Src);
    uSingleton& operator=(const uSingleton& Src);
};
template <class T> T* uSingleton<T>::s_pInstance = 0;

#endif // USINGLETON_H

Теперь, Что бы наш класс стал одиночкой пример:
Файл example.h

#include "usingleton.h"

class   Example1;
#define example Example1::instance()

class Example1: public uSingleton<Example1>
{
public:
    Example1();
    void msg();
};

Файл example.cpp

#include "example.h"
#include <QDebug>

Example1::Example1()
 :uSingleton<Example1>(*this)
{

}

void Example1::msg() {
 qDebug()<<"Hello, Singleton!";
}

Пример вызова:

example.msg();

Leave a Comment

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.