夯实基础(1):单例

133 阅读1分钟

这是我的第一篇掘金博客,开启掘金写作之路。
之前在某公司实习时,项目代码里面有用到单例模式处理一些配置相关内容,那个时候我只知道单例模式能唯一创建一个实例对象。但当我在代码中看到多处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文件,然后将相关定义放进去。