Chinaunix首页 | 论坛 | 博客
  • 博客访问: 194092
  • 博文数量: 23
  • 博客积分: 2556
  • 博客等级: 少校
  • 技术积分: 580
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-15 15:57
文章分类

全部博文(23)

文章存档

2012年(2)

2010年(6)

2009年(4)

2008年(11)

我的朋友

分类: C/C++

2012-11-23 17:48:41

/////////////////////第一种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  
class Singleton 
{
 protected:
  static T* ms_Singleton;

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

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

template T* Singleton::ms_Singleton = 0;

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

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

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

template Singleton::~Singleton()

 if (ms_Singleton)
 {
  ms_Singleton=0;   
 }
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

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

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

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

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
};
#endif // __SINGLETON_H__

 

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


 //取得实例

 template
  T& Singleton::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++

阅读(484) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~