当前位置:   article > 正文

C++单例基类模板_c++ 单例 基类 模版

c++ 单例 基类 模版


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

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

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

单例基类模板Singleton.h  

  1. template <class T>
  2. class Singleton
  3. {
  4. private:
  5. static T* m_pInstance;
  6. //禁止拷贝构造和赋值运算符. The only way is getInstance()
  7. Singleton(const Singleton& src){}
  8. Singleton &operator=(const Singleton& src){};
  9. class Garbo //它的唯一工作就是在析构函数中析构Singleton的实例,所以private
  10. {
  11. public:
  12. ~Garbo()
  13. {
  14. if (Singleton::m_pInstance)
  15. {
  16. delete Singleton::m_pInstance;
  17. Singleton::m_pInstance = NULL;
  18. }
  19. }
  20. };
  21. static Garbo garbo; //定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数,我们不需要访问这个变量,所以不需要初始化
  22. protected:
  23. //使继承者无法public构造函数和析构函数
  24. Singleton(){}
  25. ~Singleton(){}
  26. public:
  27. static T* getInstance()
  28. {
  29. if (m_pInstance == NULL) //判断是否第一次调用
  30. m_pInstance = new T();
  31. return m_pInstance;
  32. }
  33. };
  34. template <class T>
  35. T* Singleton<T>::m_pInstance = NULL; //必须初始化这个静态成员,初始化的过程中会分配内存,否则无法访问

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

例子  A.h

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


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








声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/137795?site
推荐阅读
相关标签
  

闽ICP备14008679号