C++单例写法记录
一、饿汉式
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"; };
-
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 静态成员
-
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"; };
-
instace.cpp
#include <string> #include "instance.h" // 类的静态成员变量声明 Instance02 Instance02::instance; // 获取实例地址 Instance02* Instance02::GetInstance(){ return &instance; } // 其他业务逻辑 std::string Instance02::GetName(){ return name; }
1.3 测试
-
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; }
-
结果