• C++之Singleton单例和单例模板类讲解


    目录

    1.概述

    2.单例模式的特征

    3.单例模式:程序例子

    3.单例模式模板类:程序例子


    1.概述

    Singleton 是对全局变量的取代策略。
    <1>.作用:保证一个类只能有一个实例,并提供一个全局唯一的访问点。

    <2>.仅有一个实例:通过类的静态成员变量来体现。
    <3>.提供访问它的全局访问点:访问静态成员函数来体现。

    2.单例模式的特征

    <1>.它有一个指向唯一实例的静态指针,并且是私有的;

    <2>.它有一个公有的函数,可以获取这个唯一的实例,并且在需要的时候创建该实例;

    <3>.它的构造函数是私有的,这样就不能从别处创建该类的实例。

    <4>.Singleton不可以被实例化,因此我们将其构造函数声明为protected或者直接声明为private。

    3.单例模式:程序例子

    1. #include
    2. using namespace std;
    3. class Singleton{
    4. private:
    5. //静态成员,保存对象的唯一实例
    6. static Singleton* pInstance;
    7. //私有化构造函数,使其无法在类外实例化
    8. Singleton();
    9. public:
    10. static Singleton* Instance();
    11. void Destroy();
    12. };
    13. Singleton* Singleton::pInstance = NULL;
    14. //构造函数
    15. Singleton::Singleton(){
    16. cout<< "Singleton..." << endl;
    17. }
    18. Singleton* Singleton::Instance(){
    19. if(NULL == pInstance)
    20. pInstance = new Singleton();
    21. return pInstance;
    22. }
    23. void Singleton::Destroy(){
    24. delete pInstance;
    25. pInstance = NULL;
    26. cout<< "Destroy..." << endl;
    27. }
    28. int main(){
    29. //通过全局访问点获取实例
    30. Singleton* ps = Singleton::Instance();
    31. ps->Destroy();
    32. return 0;
    33. }

    3.单例模式模板类:程序例子

    1. #include
    2. #include
    3. using namespace std;
    4. template<typename T>
    5. class Singleton {//定义类Singleton
    6. static T* c_instance;
    7. public:
    8. static T* GetInstance();
    9. private:
    10. int m_count;
    11. };
    12. template<typename T>
    13. T* Singleton::c_instance = NULL;//定义c_instance全局变量
    14. template<typename T>
    15. T* Singleton::GetInstance() {//实现单例模式函数
    16. if(c_instance == NULL)
    17. c_instance = new T();
    18. return c_instance;
    19. }
    20. class SObject{
    21. //友元类,当前类SObject需要使用Singleton类单例模式,所以定义友元类
    22. friend class Singleton;
    23. // SObject(const SObject&);
    24. // SObject& operator= (const SObject&);
    25. SObject(){
    26. printf("xxx----->len = %d\n",__LINE__);
    27. }
    28. public:
    29. void print(){
    30. cout << "this = " << this << endl;
    31. }
    32. };
    33. int main(){
    34. //将SObject类传入单例模式的类模板,然后调用GetInstance()获取类的实例化
    35. SObject* s = Singleton::GetInstance();
    36. s->print();//打印this指针的地址,查看当前实例化是否成功
    37. return 0;
    38. }

  • 相关阅读:
    AI在创造还是毁掉音乐?
    CentOS7和CentOS8 Asterisk 20.0.0 简单图形化界面7--对接讯时FXO网关落地
    Pyinstaller+InstallForge多文件项目软件打包
    接口测试 Jmeter 接口测试 —— 请求 Headers 与传参方式
    gcov c++代码覆盖率测试工具(原理篇)
    uniapp 转微信小程序遇到的坑
    【检索资讯】2022年控制理论与应用国际会议(ICOCAT 2022)已成功被EI检索
    nexus搭建npm私有镜像
    Java泛型
    Java基于小程序的讲座预约系统,附源码,教程
  • 原文地址:https://blog.csdn.net/u010164190/article/details/128173447