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库完成相关功能。

posted @ 2021-11-03 13:18  朱小勇  阅读(873)  评论(0编辑  收藏  举报