使用有状态的静态成员函数
#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; } /* * 单例模式 * * 定义一个静态成员变量,使用该静态成员变量实现单例模式 * 但是,该静态变量不会在程序结束后销毁 * * 提供一个嵌套类,实现结束后调用析构函数 */
嵌套类成员必须是静态的,因为该单例模式不能被实例化,所以如果是非静态的,那么该成员也不能被构造。