C++单例基类模板

来源:互联网 发布:松江 量化 java 招聘 编辑:程序博客网 时间:2024/06/06 15:01


开发中,经常会用到单例。特别是单例设计模式中,会出现很多单例,每个单例都有很多类似的地方,感觉一直在重复造轮子,所以希望可以改进。

其中原理主要是对c++继承规则的理解,以及 模板/友元 的一些基础知识,另外也在网上搜了一些其他的单例基类,但是都不够完善,所以自己综合了一下。

从每一步的注释,到自动析构防止内存泄漏,再到禁止拷贝赋值构造等等,代码里都有了,个人认为下面这个单例模板算是比较完善的一个了。

单例基类模板Singleton.h  

template <class T>class Singleton{    private:    static T* m_pInstance;        //禁止拷贝构造和赋值运算符. The only way is getInstance()    Singleton(const Singleton& src){}    Singleton &operator=(const Singleton& src){};        class Garbo   //它的唯一工作就是在析构函数中析构Singleton的实例,所以private    {    public:        ~Garbo()        {            if (Singleton::m_pInstance)            {                delete Singleton::m_pInstance;                Singleton::m_pInstance = NULL;            }        }    };    static Garbo garbo;  //定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数,我们不需要访问这个变量,所以不需要初始化    protected:    //使继承者无法public构造函数和析构函数    Singleton(){}    ~Singleton(){}public:    static T* getInstance()    {        if (m_pInstance == NULL)  //判断是否第一次调用            m_pInstance = new T();        return m_pInstance;    }};template <class T>T* Singleton<T>::m_pInstance = NULL; //必须初始化这个静态成员,初始化的过程中会分配内存,否则无法访问

使用方式是继承该类,并声明其基类为友元,以及将该类的构造函数声明为私有就行了

例子  A.h

class A : public Singleton<A>{    friend class Singleton<A>; //因为基类在getInstance()中 new T() 时会调用到A的构造函数public:    void function();private:     A();};


这个例子中,class A就是一个单例,比如调用A的方法时,就可以     A::getInstance()->function()

                                             
0 0