boost单例模式
本代码是仿照boost::singleton_default
1、zsingleton.h
#ifndef ZSINGLETON_H #define ZSINGLETON_H template<typename T> struct ZSingleton { private: struct object_creator { object_creator() {ZSingleton<T>::instance();} inline void do_nothing() const {} }; static object_creator create_object; ZSingleton(); public: typedef T object_type; static object_type& instance() { static object_type obj; create_object.do_nothing(); return obj; } }; //静态成员变量定义 template<typename T> typename ZSingleton<T>::object_creator ZSingleton<T>::create_object; #endif // ZSINGLETON_H
2、使用
#include "zsingleton.h"
// 1 class Foo {}; #define FooInstane ZSingleton<Foo>::instance() // 2 class Bar : public Zsingleton<Bar> {}; #define BarInstance Bar::instance()
XXXInstance->...
3、使用boost::serialization::singleton
#include <boost/serialization/singleton.hpp>
#define ITest boost::serialization::singleton<Test>::get_mutable_instance()
PS:
1、结合Qt使用时报错:QCoreApplication::applicationDirPath: Please instantiate the QApplication object first。
原因:这种单例是静态变量,静态变量会在main函数之前进行空间分配,且是线程安全的[由于C++11及之后],会在main函数之后进行回收。所以我们如果在QApplication之前进行使用Qt的一些功能,就可能报这个错【继承QObjec、使用QThread、QTimer、qDebug、信号槽等等,猜测应该是MOS相关的】
解决:使用这种方式的单例,尽量不要使用Qt的玩意儿,用纯C++和Boost库完成相关功能。
长风破浪会有时,直挂云帆济沧海!
可通过下方链接找到博主
https://www.cnblogs.com/judes/p/10875138.html