logo MSJO.kr

Singleton with Magic Static in Qt/C++

2020-09-03
MsJ
   

컴파일러가 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();
}
Reference
  1. Marc Gregoire’s Blog, Implementing a Thread-Safe Singleton with C++11 Using Magic Static
  2. YoungJin Shin, C++ VS 2015의 magic statics 구현 세부 사항
  3. 참고한 소스 : VoidRealms, Magic Statics - Singleton Replacement - Qt 5 Design Patterns

Prεv(Θld)   Nεxt(Nεw)
Content
Search     RSS Feed     BY-NC-ND