kbe之单件



template <typename T>
class Singleton
{
protected:
 static T* singleton_;
public:
 Singleton(void)
 {
  assert(!singleton_);
#if defined(_MSC_VER) && _MSC_VER < 1200 
  int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1;
  singleton_ = (T*)((int)this + offset);
#else
  singleton_ = static_cast< T* >(this);
#endif
 }
 
 
 ~Singleton(void){  assert(singleton_);  singleton_ = 0; }
 static T& getSingleton(void) { assert(singleton_);  return (*singleton_); }
 static T* getSingletonPtr(void){ return singleton_; }
};

#define KBE_SINGLETON_INIT( TYPE )       \
template <>  TYPE * Singleton< TYPE >::singleton_ = 0; \


创建一个自己的类,然后从Singleton这个模板类继承,继承之后,还需要在自己创建的类中的CPP文件中对基类继承下来的static T* singleton_进行初始化:KBE_SINGLETON_INIT(ServerConfig); ServerConfig是我自己创建的类,


然后,在自己的CPP中定义一个ServerConfig g_svrConfig,这样g_svrConfg就是一个全局单件。上面这套单件的好处就是,只要是从这个基类继承下来的派生类,全局一定是唯一的,因为,如果你还想创建一个派生类的对象,不管是用new还是直接创建一个局部对象都会assert(false).


实现单件的思路很多,这里只不过提供了其中一个比较好的方式.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值