之前, 在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的时候, 对单例的感觉不那么强烈, 但使用起来很简单。 有点意思。