游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2684|回复: 2

Ogre的Singleton实现以及改进

[复制链接]

11

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
发表于 2004-5-17 18:51:00 | 显示全部楼层 |阅读模式
Ogre是一个很好的三维图形渲染引擎,刚开始学习。有点心得,就贴上来。

下面是Ogre的Singleton实现
////////////////////////////////////////////
template <typename T> class Singleton
{
protected:
static T* ms_Singleton;

public:
Singleton( void )
{
    assert( !ms_Singleton );
#if defined( _MSC_VER ) && _MSC_VER < 1200      
    int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1;
    ms_Singleton = (T*)((int)this + offset);
#else
    ms_Singleton = static_cast< T* >( this );
#endif
}
~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的类
class Root:public Singleton<Root>
{
   public:
      void Use();
};
//初始化
Root * Singleton<Root>::ms_Singleton =0;
//使用
Root::getSingleton().Use();

////////////////////////////////////////////////
想法很简单,但是很巧妙,就是将ms_Singleton 指向父类。

缺点就是要自己负责声明ms_Singleton,麻烦。
所以我采用template static member function手法来改进一下
///////////////////////////////////////////////
template <typename T> class Singleton
{
protected:
static T* & ms_Singleton()
        {
                static T* ms_Singleton_ =0 ;
                return ms_Singleton_;
        }
        
public:
Singleton( void )
{
    assert( !ms_Singleton() );
#if defined( _MSC_VER ) && _MSC_VER < 1200      
    int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1;
    ms_Singleton() = (T*)((int)this + offset);
#else
                ms_Singleton() = static_cast< T* >( this );
#endif
}
~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() );  }
};
////////////////////////////////////////////////

11

主题

53

帖子

53

积分

注册会员

Rank: 2

积分
53
发表于 2004-5-18 08:42:00 | 显示全部楼层

Re:Ogre的Singleton实现以及改进

up

0

主题

2

帖子

64

积分

注册会员

Rank: 2

积分
64
发表于 2015-5-9 19:25:25 | 显示全部楼层
学习了,谢谢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-25 20:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表