#ifndef _SINGLETONT_H_
#define _SINGLETONT_H_
#include <cassert>
#define NULL 0
/*
*此为单件模板类,所有需要单件功能的类可以继承此模板类,
*并重写getSingleton(),getSingletonPtr()和相应的copy,operator=()
*从而实现单件的功能。
*/
template <typename T>
class SingletonT
{
public:
/*模板Singleton类的构造函数,由于断言和静态ms_singleton的存在,
*所以只能实例化一个Singleton
*再次实例化时会被断言阻止输出错误信息
*/
SingletonT()
{
assert(!ms_singleton);
//ms_singleton用来跟踪子类实例对象的跟踪
ms_singleton = static_cast< T* >(this);
}
~SingletonT()
{
assert(ms_singleton);
ms_singleton = 0;
}
//获得子类的唯一实例对象
static T& getSingleton()
{
assert(ms_singleton);
if (ms_singleton == NULL)
{
ms_singleton = new T;
}
return (*ms_singleton);
}
//获得子类的唯一实例对象的指针
static T* getSingletonPtr()
{
if (ms_singleton == NULL)
{
ms_singleton = new T;
}
return ms_singleton;
}
protected:
//ms_singleton为全局唯一存在的实例对象
static T* ms_singleton;
private:
/*
*将copy和operator=声明为私有,即外界不能通过这2中途径进行实例化
*/
SingletonT(const SingletonT<T>&);
SingletonT& operator=(const SingletonT<T>&);
};
#endif
需要使用单件的类继承SingletonT类,并在其实现文件中初始化
class CameraSystem : public SingletonT<CameraSystem>
template<> CameraSystem* SingletonT<CameraSystem>::ms_singleton = 0;