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;
}
-
结果
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)