赞
踩
开发中,经常会用到单例。特别是单例设计模式中,会出现很多单例,每个单例都有很多类似的地方,感觉一直在重复造轮子,所以希望可以改进。
其中原理主要是对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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。