最簡單的寫法:c++
1 |
static MyClass* MyClass::Instance() |
過去很長一段時間一直都這麼寫,簡單粗暴有效。可是直接聲明靜態對象會使編譯出的可執行文件增大,也有可能出現其餘的一些問題,因此利用了Qt自帶的智能指針QScopedPointer
和線程鎖QMutex
,改爲了須要時才動態初始化的模式:安全
1 |
static MyClass* MyClass::Instance() |
既保證了線程安全又防止了內存泄漏,效率也沒下降太多,簡直完美。函數
惋惜每次都要重複這麼幾行實在麻煩,因而寫了一個模板類:spa
1 |
template <class T> |
使用的時候直接這樣——線程
1 |
MyClass* inst = Singleton<MyClass>::Instance(); |
除了用模板類,還能夠利用c++中強大的宏:指針
1 |
|
而後聲明的時候,填加一行這個宏:code
1 |
class MyClass |
好評好評。對象
固然,爲了要保證真的是單例模式,還要把構造函數限制爲private,否則之後何時忘記了這碼事,在外面又new了一下就很差了。blog
另外Qt自己自帶了一個宏Q_GLOBAL_STATIC
,也有相似單例模式的效果,QThreadPool::globalInstance()
函數的實現就是利用了這個宏。不過它的主要用處是聲明全局變量,和Singleton仍是有差異的。內存
https://blog.yeatse.com/2015/03/03/qt-singleton-implementation/