这是我的第一篇掘金博客,开启掘金写作之路。
之前在某公司实习时,项目代码里面有用到单例模式处理一些配置相关内容,那个时候我只知道单例模式能唯一创建一个实例对象。但当我在代码中看到多处SingleTon *p = SingleTon::GetInstance()时,瞬间迷惑了。直到最近再次研究才恍然大悟,这些指针指向的是同一个对象。
//.h
class SingleTon{
SingleTon() = default;
static SingleTon *m_instance;
public:
static SingleTon* GetInstance(){
if(m_instance==nullptr)
{
m_instance = new SingleTon();
static CGarHuishou cgh;
}
return m_instance;
}
class CGarHuishou{
public:
~CGarHuishou(){
if(SingleTon::m_instance){
//std::cout<<"delete memory"<<std::endl;
delete SingleTon::m_instance;
SingleTon::m_instance = nullptr;
}
}
};
}
SingleTon* SingleTon::m_instance = nullptr;
//.cpp
SingleTon *s1 = SingleTon::GetInstance();
SingleTon *s2 = SingleTon::GetInstance();
std::cout<<s1<<"\t"<<std::endl;
目前我是这么理解的:
单例的唯一对象m_instance和构造函数私有,故需要一个能在类外访问的接口函数,即GetInstance()静态函数。又静态成员函数归类所有,不包含this指针,只能访问静态成员,故m_instance定义为静态成员变量。同时,在该函数中,用类内嵌套类的方式控制内存的释放。由于cgh变量的生命周期持续到程序退出,故程序结束时自动调用CGarHuishou析构函数,释放m_instance对象。
额外的问题:
对于上述静态成员变量的初始化,如果在vs中,则放在.h头文件中没问题;而如果在qt中,放在.h头文件时,会提示重定义错误,修改到.cpp文件中就没有问题了。
究其原因,是因为在qt中多次包含了.h文件导致出现重定义错误。我倾向于单独建一个.cpp文件,然后将相关定义放进去。