使用singleton

什么是singleton?

它是一种方法,使的类的实例在程序中只有一个。它出现的原因是因为许多系统中一些对象只能存在一个,同时也是为取代全局变量和函数。

最简单来讲就是:
class OneClass
{
protect:
        static OneClass m_Instance;

public:
        static OneClass GetSingleton()
        {
                return m_Instance;
        }
};
或者
class OneClass
{
public:
        OneClass & Instance()
        {
                 static OneClass m_Instance;
                 return m_Instance;
        }
}
其实质就是定义静态变量并始终只返回此静态变量。

但是,要实现安全有效的使用singleton可以使用下面的模版技术。

《游戏编程精粹1》中介绍如下:

#include <cassert>

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

  public:
        Singleton( void )
        {
                 assert(!ms_Singleton);
                 int offset = (int) (T*)1 - (int) (Singleton <T> *) (T*) 1;
                 ms_Singleton = (T*) ( (int) this + offset );
        }
        ~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);
         }
};

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

接着就可以将任何类转化为singleton,可以按下面步骤:
1)从Singleton<MyClass>公开派生你的类MyClass;
2)确保使用前在系统中创建了MyClass的实例。可以设为静态也可以使用new和delete。
3)调用时使用MyClass::GetSingleton()方法。

下面是一个例子:
//定义
class App: public Singleton <App>
{
          void Run(){};
}

//初始化
static App app1;

//访问
void SomeFunction()
{
           App::GetSingleton.Run();
           //... ...
}
这里可能有些人会看不懂,开始我就是这样,主要是因为涉及到模版,下面来介绍一下一些基本概念:
参考我的另一篇文章:http://blog.csdn.net/cnjet/archive/2005/10/16/504794.aspx

参考:
http://www.ogre3d.org/wiki/index.php/Singleton

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值