Qt下Singletonモードメモ
The Singleton pattern restricts a class so that only one instance can be created. This can be accomplished by making its constructor private or protected and providing an instance() function that creates a new instance if one does not already exist, but returns a pointer or reference to that instance if it does.
Singleton(単品)モードの意図は、クラスにインスタンスが1つしかないことを保証し、そのグローバルアクセスポイントにアクセスすることです.
マルチスレッド環境に適用されるSingletonモードはDouble-Checked Locking(二重チェックロック)モードとも呼ばれる.
コード#コード# singleton.h singleton.cpp
C++で単品モードを実装する場合、オブジェクトを破棄するタイミングは常に問題のようです.Qtでは、プログラム(一般)にQCoreApplicationまたはその派生クラスのオブジェクトがあるため、QObject半自動のメモリ管理方式を加えます.QCoreApplicationのオブジェクトをこの単一オブジェクトの親として扱うと,問題は解決されるはずである.
QCoreApplication
前述したように、クラスにインスタンスが1つしかないことを保証し、そのグローバル・アクセス・ポイントにアクセスします.QCoreApplicationも単品モードに属するはずです.しかし、その実現は少し変態(中性語ハ)で、そのコードを見てみましょう. qcoreapplication.h qcoreapplication.cpp
qApp
このマクロに興味がある人もいるかもしれません qcoreapplication.h qapplication.h
QCoreApplicationまたはQAPplicationを派生させる場合は、マクロの再定義も考慮される場合があります.
リファレンス Design Patterns Explained, Chapter 16 Introduction to Design Patterns in C++ with Qt 4, chapter 16 http://www.qtcentre.org/wiki/index.php?title=Singleton_pattern
Singleton(単品)モードの意図は、クラスにインスタンスが1つしかないことを保証し、そのグローバルアクセスポイントにアクセスすることです.
マルチスレッド環境に適用されるSingletonモードはDouble-Checked Locking(二重チェックロック)モードとも呼ばれる.
コード#コード#
#include
#include
#include
class Singleton:public QObject
{
public:
static Singleton* instance()
{
static QMutex mutex;
if (!m_instance) {
QMutexLocker locker(&mutex);
if (!m_instance)
m_instance = new Singleton;
}
return m_instance;
}
private:
Singleton();
static Singleton* m_instance;
};
#include
#include "singleton.h"
Singleton *Singleton::m_instance = 0;
Singleton::Singleton():
QObject(qApp)
{
}
C++で単品モードを実装する場合、オブジェクトを破棄するタイミングは常に問題のようです.Qtでは、プログラム(一般)にQCoreApplicationまたはその派生クラスのオブジェクトがあるため、QObject半自動のメモリ管理方式を加えます.QCoreApplicationのオブジェクトをこの単一オブジェクトの親として扱うと,問題は解決されるはずである.
QCoreApplication
前述したように、クラスにインスタンスが1つしかないことを保証し、そのグローバル・アクセス・ポイントにアクセスします.QCoreApplicationも単品モードに属するはずです.しかし、その実現は少し変態(中性語ハ)で、そのコードを見てみましょう.
class Q_CORE_EXPORT QCoreApplication : public QObject
{
public:
QCoreApplication(int &argc, char **argv);
static QCoreApplication *instance() { return self; }
...
private:
void init();
static QCoreApplication *self;
...
};
QCoreApplication *QCoreApplication::self = 0;
QCoreApplication::QCoreApplication(int &argc, char **argv)
{
init();
...
}
void QCoreApplication::init()
{
Q_ASSERT_X(!self, "QCoreApplication", "there should be only one application object");
QCoreApplication::self = this;
...
}
qApp
このマクロに興味がある人もいるかもしれません
#define qApp QCoreApplication::instance()
#if defined(qApp)
#undef qApp
#endif
#define qApp (static_cast(QCoreApplication::instance()))
QCoreApplicationまたはQAPplicationを派生させる場合は、マクロの再定義も考慮される場合があります.
リファレンス