三种实现单件的代码

/第一种SINGLETON模式///
//
// Sphi Middleware
// Copyright (C) 2007, Yuri Ivatchkovitch
// sphi.sourceforge.net
//


#ifndef __SINGLETONOLD_H__
#define __SINGLETONOLD_H__

#pragma warning( disable:4311 )
#pragma warning( disable:4312 )



namespace PatternSin
{
template <typename T>
class Singleton
{
 protected:
  static T* ms_Singleton;

 public:
  Singleton();
  virtual ~Singleton();
  static T& GetSingleton();
  static T* GetSingletonPtr();
};


template <typename T> T* Singleton<T>::ms_Singleton = 0;


template <typename T> Singleton<T>::Singleton()
{
 if (!ms_Singleton)
 {
  int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1;
  ms_Singleton = (T*)((int)this + offset);
 }
}


template <typename T> Singleton<T>::~Singleton()
{
 if (ms_Singleton)
 {
  ms_Singleton=0;   
 }
}


template <typename T> T& Singleton<T>::GetSingleton()
{
 return (*ms_Singleton);
}


template <typename T> T* Singleton<T>::GetSingletonPtr()
{
 return (ms_Singleton);
}



};
#endif // __SINGLETON_H__

 

第二种Singleton模式/
 template<class T>
 class Singleton
 {
 public:
  static T& Instance();  //取得实例 
 protected:
  Singleton(){}
  virtual ~Singleton() {} 
 private:
  //防止拷贝复制  
  Singleton(const Singleton&);
  Singleton& operator= (const Singleton&);
 };


 //取得实例

 template<class T>
  T& Singleton<T>::Instance()
 {
  static T instance;  //局部静态对象
     HWND pHwnd = GetActiveWindow();//不要问我为什么加这句,我也不知道,不加RELEASE不过,一加就过,我试了两天才解决.
  return instance;
 }


/第三种Singleton模式
#define DECL_SINGLETON(singleton) static singleton *m_p##singleton; static singleton& singleton::p() {return *m_p##singleton;};
#define CREATE_SINGLETON(singleton) static singleton m_##singleton; singleton* singleton::m_p##singleton = &m_##singleton;

EXAMPLE:guiSelectManager、
h文件内
static guiSelectManager *m_pguiSelectManagersingleton;
static guiSelectManager& guiSelectManager::p() { return *m_pguiSelectManagersingleton; }

cpp
static guiSelectManager m_guiSelectManagersingleton;
guiSelectManager* guiSelectManager::m_pguiSelectManager = & m_guiSelectManagersingleton;

 

区别在哪?STATIC是局部静态变象还是非局部静态对象,参见MORE EFFECT C++

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值