C++单例写法记录

C++单例写法记录

一、饿汉式

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

  1. instance.h

    #ifndef INSTANCE_H
    #define INSTANCE_H
    #include <string>
    #include <iostream>
    
    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"; 
    };
    
  2. instace.cpp

    #include <string>
    #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 静态成员

  1. instance.h

    #ifndef INSTANCE_H
    #define INSTANCE_H
    #include <string>
    #include <iostream>
    
    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"; 
    };
    
  2. instace.cpp

    #include <string>
    #include "instance.h"
    
    // 类的静态成员变量声明
    Instance02 Instance02::instance;
    
    // 获取实例地址
    Instance02* Instance02::GetInstance(){
        return &instance;
    }
    
    // 其他业务逻辑
    std::string Instance02::GetName(){
        return name;
    }
    

1.3 测试

  1. main.cpp

    #include <iostream>
    #include "instance.h"
    
    int main(void){
        std::cout << Instance01::GetInstance()->GetName() << std::endl;
        std::cout << Instance02::GetInstance()->GetName() << std::endl;
        return 0;
    }
    
  2. 结果

    单例结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值