再看一个精妙的单例

来源:互联网 发布:php密码破解 编辑:程序博客网 时间:2024/05/16 01:45

         之前, 在http://blog.csdn.net/stpeace/article/details/68953253中, 我们一起看到过精妙的单例, 搬移过来看看:

#include <iostream>using namespace std;class A{public:int x;A(){printf("A constrct\n");}~A(){printf("A destruct\n");}};template <typename T>class CSingleton {public:static T* getInstance();};template <typename T>T* CSingleton<T>::getInstance(){static T instance;return &instance;}int main() {CSingleton<A>::getInstance()->x = 100;cout << CSingleton<A>::getInstance()->x << endl;cout << CSingleton<A>::getInstance()->x << endl;cout << CSingleton<A>::getInstance()->x << endl;return 0;}
       结果:

A constrct
100
100
100
A destruct


      在上述单例中, 用的时候, CSingleton<A>让人时刻知道这是个单例, 感觉爽。  最近, 我遇到了上述单例的变形, 来看看:

#include <iostream>using namespace std;template <typename T>class CSingleton {public:static T* getInstance();};template <typename T>T* CSingleton<T>::getInstance(){static T instance;return &instance;}class A : public CSingleton<A>{public:int x;A(){printf("A constrct\n");}~A(){printf("A destruct\n");}};int main() {A::getInstance()->x = 100;cout << A::getInstance()->x << endl;cout << A::getInstance()->x << endl;cout << A::getInstance()->x << endl;return 0;}
      结果:

A constrct
100
100
100
A destruct

      此时, 在使用A的时候, 对单例的感觉不那么强烈, 但使用起来很简单。 有点意思。