컴파일러가 C++11을 완전히 지원하는 경우 싱글톤을 구현하는 가장 좋은 방법은 ‘Magic Static’을 사용하는 것이다1. C++11부터는 static 객체 생성이 스레드에 안전하게 보장하도록 표준에 추가되었다2. 참고로 Qt(C++)에서 QThread, QMutex 사용법에 대한 예제는 msjo.kr, Qt(C++) QThread, QMutex에서 볼 수 있다.
singleton.h
#ifndef SINGLETON_H
#define SINGLETON_H
template <typename T> class Singleton final
{
public:
static T &GetInstance()
{
static T instance;
return instance;
}
private:
Singleton() = default;
~Singleton() = default;
Singleton(const Singleton &) = delete;
Singleton &operator=(const Singleton &) = delete;
Singleton(Singleton &&) = delete;
Singleton &operator=(Singleton &&) = delete;
};
#endif // SINGLETON_H
myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QObject>
#include <QDebug>
class MyClass : public QObject
{
Q_OBJECT
public:
explicit MyClass(QObject *parent = nullptr);
~MyClass();
void display(const QString &message);
signals:
};
#endif // MYCLASS_H
myclass.cpp
#include "myclass.h"
MyClass::MyClass(QObject *parent) : QObject(parent)
{
qDebug() << this << "created";
}
MyClass::~MyClass()
{
qDebug() << this << "destroyed";
}
void MyClass::display(const QString &message)
{
qDebug() << this << message;
}
main.cpp
#include "myclass.h"
#include "singleton.h"
#include <QCoreApplication>
void scopetest()
{
Singleton<MyClass>::GetInstance().setObjectName("Delphi");
Singleton<MyClass>::GetInstance().display("from scope test");
}
void looptesst()
{
Singleton<MyClass>::GetInstance().display("starting loop");
for (int i = 0; i < 10; i++) {
Singleton<MyClass>::GetInstance().display(QString::number(i));
}
Singleton<MyClass>::GetInstance().display("finished loop");
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
scopetest();
looptesst();
Singleton<MyClass>::GetInstance().display("hello from main");
qDebug() << Singleton<MyClass>::GetInstance().objectName();
a.exit(0);
// return a.exec();
}