0

これ以外のクラス シングルトン メソッドはありますか?

class Foo
{
private:
Foo(){};
~Foo(){};
public:
 static Foo& GetInstance( void )
    {
      static Foo obj;
      return obj;
    }
};

これは素晴らしく、すべてのケースで機能しますが、クラス コンストラクターは最初にアクセスされたときにのみ呼び出されます。これにより、コンストラクターでファイルの読み取りがあり、クラス メンバーの値が設定されている場合などに、GetInstance()いくつかの問題が発生します。 WinMain.ini/.lua 構成のように

4

1 に答える 1

0

個人的には、Singleton クラスをインスタンス化するこの方法は好きではありません。関数を使用しinitて明示的にクラスを作成し、Done関数を解放するのが好きです。また、テンプレートを使用すると、すべてが少しきれいになります。ファイルのロードに関しては、これはおそらく子クラスのメソッドである必要があります。

// Singleton.h
template<class T>
class Singleton
{
  public:
    static void Init() { m_pInst = new T(); }
    static void Done() { delete m_pInst; }
    static T& GetInstance() { assert(m_pInst); return *m_pInst; }
  protected:
    Singleton() {}
  private:
    Singleton(const Singleton&) {}
  private:
    static T* m_pInst;
}

// Foo.h
class Foo : public Singleton<Foo>
{
  public:
    void LoadConfig(const char* path) {} // Load config.
}

// Foo.cpp
Foo* Singleton<Foo>::m_pInst = NULL;
于 2012-10-28T02:56:37.627 に答える