本文共 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/