【C++语法实践】04-C++实现单例模式

使用有状态的静态成员函数

#include <iostream>
using namespace std;

class SingleTon
{
public:
    static SingleTon& GetInstance()
    {
        static SingleTon instance_; // 有状态的
        return instance_;
    }

    ~SingleTon()
    {
        cout << "~SingleTon" << endl;
    }

private:
    SingleTon() { cout << "SingleTon Construction" << endl; }
    SingleTon(const SingleTon& other);
    SingleTon& operator = (const SingleTon& other);

};

int main()
{
    SingleTon& s1 = SingleTon::GetInstance();
    SingleTon& s2 = SingleTon::GetInstance();
    return 0;
}

成员函数static SingleTon& GetInstance()在第二次调用的时候,就不会再重复定义instance_成员,此时,称该函数是有状态的。有状态的函数不是线程安全的函数

提供一个嵌套类,实现资源的释放

#include <iostream>
using namespace std;

class SingleTon
{
public:
    static SingleTon* GetInstance()
    {
        if (instance_ == NULL)
            instance_ = new SingleTon();
        return instance_;
    }

    ~SingleTon()
    {
        cout << "~SingleTon" << endl;
    }

    class Garbo
    {
    public:
        ~Garbo()
        {
            if (SingleTon::instance_ != NULL)
                delete SingleTon::instance_;
        }
    };

private:
    SingleTon() { cout << "SingleTon Construction" << endl; }
    SingleTon(const SingleTon& other);
    SingleTon& operator = (const SingleTon& other);

private:
    static SingleTon* instance_;
    static Garbo garbo_; // 必须是静态,因为如果不是非静态的,那么会被初始化
};

SingleTon::Garbo SingleTon::garbo_;
SingleTon* SingleTon::instance_;

int main()
{
    SingleTon* s1 = SingleTon::GetInstance();
    SingleTon* s2 = SingleTon::GetInstance();
    return 0;
}

/*
 * 单例模式
 *
 * 定义一个静态成员变量,使用该静态成员变量实现单例模式
 * 但是,该静态变量不会在程序结束后销毁
 *
 * 提供一个嵌套类,实现结束后调用析构函数
*/

嵌套类成员必须是静态的,因为该单例模式不能被实例化,所以如果是非静态的,那么该成员也不能被构造。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部