游戏编程精粹(一) 自动的单例(Singleton)模式

介绍一种通过模板自动实现的单例模式

#include <assert.h>

template<typename T>
class Singleton
{
    static T* ms_Singleton;
public:
    Singleton()
    {
        assert(!ms_Singleton);
        int offset = (int)(T*)1 - (int)(Singleton<T>*)(T*)1;
        ms_Singleton = (T*)((int)this + offset);
    }

    ~Singleton()
    {
        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;

这么做可以将任何类转换成单例模式,只需要

1. 从 Singleton<MyClass> 公开派生你的类

2.确保在使用前创建了 MyClass 实例

3.调用 MyClass::GetSingleton 或者 MyClass::GetSingletonPtr()得到

class MyClass : public Singleton<MyClass>
{
public:
    MyClass() {}
    ~MyClass() {}

    void DoSomething() {}
private:

};

int main()
{
    MyClass myclass;
    MyClass::GetSingletonPtr()->DoSomething();

    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42561030/article/details/80834608