天天看點

singleton的實作

1.通常的實作方式

template <typename T>
class singleton
{
public:
  static T& GetInstance()
  {
    if (!mpSingleton)
      mpSingleton = new T();
    return *mpSingleton;
  }

  static void DeInit()
  {
    if (mpSingleton)
      delete mpSingleton;
  }

protected:
  singleton();

private:
  singleton(const singleton&);
  singleton& operator=(const singleton&);

private:
  static T* mpSingleton;
};
           

2.在《遊戲程式設計精粹1》上看到的”一種自動的singleton工具“

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

  ~singleton()
  {
    assert(mpSingleton);
    mpSingleton = 0;
  }

public:
  static T& GetInstance()
  {
    assert(mpSingleton);
    return *mpSingleton;
  }

  static T* GetInstancePtr()
  {
    assert(mpSingleton);
    return mpSingleton;
  }

private:
  static T* mpSingleton;
};

template <typename T> T* singleton::mpSingleton = 0;