小明思考

高性能服务器端计算
posts - 70, comments - 428, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Ogre的Singleton实现以及改进

Posted on 2005-11-30 11:38 小明 阅读(2352) 评论(1)  编辑 收藏 引用 所属分类: C/C++Game Development
www.ogre3d.org
OGRE: A 3D library for OpenGL and/or Direct3D

 

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

public:
Singleton( 
void )
{
    assert( 
!ms_Singleton );
    ms_Singleton 
= static_cast< T* >this );
}
~Singleton( void )
    {  assert( ms_Singleton );  ms_Singleton 
= 0;  }
static T& getSingleton( void )
    {  assert( ms_Singleton );  
return ( *ms_Singleton );  }
static T* getSingletonPtr( void )
    {  
return ( ms_Singleton );  }
};

//client端的代码
//Singleton的类
//Root.h
class Root:public Singleton<Root>
{
   
public:
      
void Use();
};

//初始化
//Root.cpp
Root * Singleton<Root>::ms_Singleton =0;
Root g_root;
//must declare once only

//使用
//Test.Cpp
Root::getSingleton().Use();

很简单,使用的技巧是template base class
这种实现方法的好处是复用性好。
不过使用者要声明Root * Singleton<Root>::ms_Singleton =0;挺讨厌的

改进方法:template static member function
也就是改变声明一个static T*在template class,换成使用静态成员函数取出instance

template <typename T> class Singleton
{
private:
static T* & ms_Singleton()
        {
                
static T* ms_Singleton_ =0 ;
                
return ms_Singleton_;
        }
        
public:
Singleton( 
void )
{
    assert( 
!ms_Singleton() );
    ms_Singleton() 
= static_cast< T* >this );
}
~Singleton( void )
        {  assert( ms_Singleton() );  ms_Singleton() 
= 0;  }
static T& getSingleton( void )
        {  assert( ms_Singleton() );  
return ( *ms_Singleton() );  }
static T* getSingletonPtr( void )
        {  
return ( ms_Singleton() );  }
};



 

Feedback

# re: Ogre的Singleton实现以及改进  回复  更多评论   

2005-12-01 09:39 by 力为
OGRE每一个继承了Singleton的类中,都重写了
static T& getSingleton( void )

static T* getSingletonPtr( void )
目的是消除编译错误。

使用不太方便。

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理