模板代码如下:
template <typename T>
class Singleton{
private:
static T *s_this;
protected:
Singleton()
{
assert(s_this == nullptr || "单例模式");
s_this = static_cast<T*>(this);
}
~Singleton(){s_this = nullptr;}
public:
static T& GetSingleton(){return *s_this;}
};
template<typename T>
T* Singleton<T>::s_this = nullptr;
假设SubClass为需要实现单例模式的类,使用方法如下:
class SubClass: public Singleton<SubClass>{...};
调用单例模式的方法如下:
SubClass::GetSingleton();
详细注释:
- 模板类的构造和析构函数非公有,因为单纯的创建本类对象是没有意义的。
- nullptr是C++11中的关键字,表示空指针。
- C++的模板机制能够保证,每个类内部的静态变量s_this只被实例化一次,虽然它被定义在头文件中。这种特性使得我们可以在头文件中定义全局变量。