singleton.hpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /* Singleton 是单例类的模板。
  2. * https://www.cnblogs.com/sunchaothu/p/10389842.html
  3. * 单例 Singleton 是设计模式的一种,其特点是只提供唯一一个类的实例,具有全局变量的特点,在任何位置都可以通过接口获取到那个唯一实例;
  4. * 全局只有一个实例:static 特性,同时禁止用户自己声明并定义实例(把构造函数设为 private 或者 protected)
  5. * Singleton 模板类对这种方法进行了一层封装。
  6. * 单例类需要从Singleton继承。
  7. * 子类需要将自己作为模板参数T 传递给 Singleton<T> 模板;
  8. * 同时需要将基类声明为友元,这样Singleton才能调用子类的私有构造函数。
  9. // 子类必须把父类设定为友元函数,这样父类才能使用子类的私有构造函数。
  10. // 父类的构造函数必须保护,子类的构造函数必须私有。
  11. // 必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来操作 唯一的实例。
  12. * */
  13. #ifndef __SINGLIETON_H
  14. #define __SINGLIETON_H
  15. //#include <iostream>
  16. template<typename T>
  17. class Singleton {
  18. public:
  19. //获取单例的引用
  20. static T &get_instance_references() {
  21. static T instance;
  22. return instance;
  23. }
  24. //获取单例的指针
  25. static T *get_instance_pointer() {
  26. return &(get_instance_references());
  27. }
  28. virtual ~Singleton() {
  29. // std::cout<<"destructor called!"<<std::endl;
  30. }
  31. Singleton(const Singleton &) = delete; //关闭拷贝构造函数
  32. Singleton &operator=(const Singleton &) = delete; //关闭赋值函数
  33. protected:
  34. //构造函数需要是 protected,这样子类才能继承;
  35. Singleton() {
  36. // std::cout<<"constructor called!"<<std::endl;
  37. }
  38. };
  39. /*
  40. // 如下是 使用样例:
  41. // 子类必须把父类设定为友元函数,这样父类才能使用子类的私有构造函数。
  42. // 父类的构造函数必须保护,子类的构造函数必须私有。
  43. // 必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来进行操作唯一的实例。
  44. class DerivedSingle:public Singleton<DerivedSingle>
  45. {
  46. // 子类必须把父类设定为友元函数,这样父类才能使用子类的私有构造函数。
  47. friend class Singleton<DerivedSingle>;
  48. public:
  49. // 必须关闭拷贝构造和赋值构造,只能通过 get_instance 函数来进行操作唯一的实例。
  50. DerivedSingle(const DerivedSingle&)=delete;
  51. DerivedSingle& operator =(const DerivedSingle&)= delete;
  52. ~DerivedSingle()=default;
  53. private:
  54. // 父类的构造函数必须保护,子类的构造函数必须私有。
  55. DerivedSingle()=default;
  56. };
  57. int main(int argc, char* argv[]){
  58. DerivedSingle& instance1 = DerivedSingle::get_instance_references();
  59. DerivedSingle* p_instance2 = DerivedSingle::get_instance_pointer();
  60. return 0;
  61. }
  62. */
  63. #endif