单例模式的基本概念
基本实现
#include<cstdio>
class singleton
{
public:
static singleton* get_singleton(){
if(instance_ == nullptr){
instance_ = new singleton();
}
return instance_;
}
void print_addr(){
printf("%d\n",instance_);
}
~singleton()
{
printf("deconstructor singleton\n");
}
private:
static singleton *instance_;
};
singleton * singleton::instance_ = nullptr;
int main()
{
singleton *test = singleton::get_singleton();
test->print_addr();
singleton *test1 = singleton::get_singleton();
test1->print_addr();
return 0;
}
输出结果:
29990928
29990928
完整实现
#include<cstdio>
class singleton
{
public:
static singleton* get_singleton(){
if(instance_ == nullptr){
instance_ = new singleton();
}
return instance_;
}
void print_addr(){
printf("%d\n",instance_);
}
~singleton()
{
printf("deconstructor singleton\n");
}
//内嵌类用于垃圾回收
class garbage_collection
{
public:
~garbage_collection()
{
if(singleton::instance_ != nullptr){
delete singleton::instance_;
instance_ = nullptr;
}
printf("deconstructor garbage_collection\n");
}
};
private:
static garbage_collection gcer_; //静态内嵌类对象用于触发析构函数
static singleton *instance_;
};
//静态成员变量必须在类外面初始化
singleton * singleton::instance_ = nullptr;
singleton::garbage_collection singleton::gcer_;
int main()
{
singleton *test = singleton::get_singleton();
test->print_addr();
singleton *test1 = singleton::get_singleton();
test1->print_addr();
return 0;
}
输出结果:
30433296
30433296
deconstructor singleton
deconstructor garbage_collection