单件模式

#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;
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值