博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用singleton
阅读量:2438 次
发布时间:2019-05-10

本文共 1251 字,大约阅读时间需要 4 分钟。

什么是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://qhwqb.baihongyu.com/

你可能感兴趣的文章
Oracle 10g Release2新功能之变化通知(转)
查看>>
ORACLE之常用FAQ V1.0一(构架体系)(转)
查看>>
Oracle 10g 新特性之虚拟专用数据库(转)
查看>>
深刻理解Oracle数据库的启动和关闭(转)
查看>>
将Oracle 10g内置的安全特性用于PHP(转)
查看>>
骇客攻击:跳板攻击与防御(1)(转)
查看>>
黑客入侵计中计(转)
查看>>
谈DoS攻击和DDoS的攻击方式(转)
查看>>
Word 2003 视频教程-关闭 Word(转)
查看>>
JBuilder8配置CVSNT 2.0 (转)
查看>>
分布式反射:新一代的DDoS攻击(转)
查看>>
SYN Flood攻击的基本原理(转)
查看>>
软件开发怎么管?---产品、过程、人员三要素 (转)
查看>>
用dhtml做了一个密码管理器 (转)
查看>>
Php 3.x与4.x中关于对象编程的不兼容问题 (转)
查看>>
Cg FAQ (转)
查看>>
在access中增加农历支持模块. (转)
查看>>
增加一个判断内存变量存在的函数 (转)
查看>>
ASP文件上传神功 第二重(招势图加内功心法) (转)
查看>>
JSR227:J2EE数据绑定及数据访问标准 (转)
查看>>