• C++单例写法记录


    C++单例写法记录

    一、饿汉式

    1.1 静态指针、静态垃圾回收类

    1. instance.h

      #ifndef INSTANCE_H
      #define INSTANCE_H
      #include 
      #include 
      
      class Instance01{
      private:
          class Garbo{
          public:
              ~Garbo();
          };
      
      private:
          Instance01(){std::cout << "Instance01 的构造函数" << std::endl;}
          ~Instance01(){std::cout << "Instance01 的析构函数" << std::endl;}
      
          Instance01(const Instance01& instance) = delete;
          Instance01& operator=(const Instance01& Instance) = delete;
      
      public:
          static Instance01* GetInstance();
      
          /*
              其他成员函数
          */
          std::string GetName(); 
      
      private:
          static Instance01* instancePtr;
          static Garbo garbo;
      
          /*
              其他成员变量
          */
          std::string name = "I am Instance01"; 
      };
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
    2. instace.cpp

      #include 
      #include "instance.h"
      // 类的静态成员变量声明
      Instance01* Instance01::instancePtr = new Instance01();
      Instance01::Garbo Instance01::garbo;
      
      // 内存回收
      Instance01::Garbo::~Garbo(){
          if(instancePtr != nullptr){
              delete instancePtr;
              instancePtr = nullptr;
          }
      }
      
      // 获取实例地址
      Instance01* Instance01::GetInstance(){
          return instancePtr;
      }
      
      // 其他业务逻辑
      std::string Instance01::GetName(){
          return name;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23

    1.2 静态成员

    1. instance.h

      #ifndef INSTANCE_H
      #define INSTANCE_H
      #include 
      #include 
      
      class Instance02{
      private:
          Instance02(){std::cout << "Instance02 的构造函数" << std::endl;}
          ~Instance02(){std::cout << "Instance02 的析构函数" << std::endl;}
      
          Instance02(const Instance02& instance) = delete;
          Instance02& operator=(const Instance02& Instance) = delete;
      
      public:
          static Instance02* GetInstance();
      
          /*
              其他成员函数
          */
          std::string GetName(); 
      
      private:
          // 静态成员,程序结束自动释放内存
          static Instance02 instance;
      
          /*
              其他成员变量
          */
          std::string name = "I am Instance02"; 
      };
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
    2. instace.cpp

      #include 
      #include "instance.h"
      
      // 类的静态成员变量声明
      Instance02 Instance02::instance;
      
      // 获取实例地址
      Instance02* Instance02::GetInstance(){
          return &instance;
      }
      
      // 其他业务逻辑
      std::string Instance02::GetName(){
          return name;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15

    1.3 测试

    1. main.cpp

      #include 
      #include "instance.h"
      
      int main(void){
          std::cout << Instance01::GetInstance()->GetName() << std::endl;
          std::cout << Instance02::GetInstance()->GetName() << std::endl;
          return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    2. 结果

      单例结果

  • 相关阅读:
    张宇30讲学习笔记
    深度解剖数据在栈中的应用
    基于SpringBoot的招生管理系统
    docker 部署 kafka-ui
    Windows安装mysql详细步骤(通俗易懂,简单上手)
    从数学0到指针NULL,到std vector右边界,到空操作
    c#调用CUDA执行YOLOV5对象检测
    热点文章采集-热点资讯采集工具免费
    在运营商干活,还可以这么切割网络
    邦盛科技冲刺上市“冷思考”:身处红线边缘,达摩克利斯之剑高悬
  • 原文地址:https://blog.csdn.net/qq_42313728/article/details/127760460