1

私はこのシングルトン パターンに従っています。この場合、エラー LNK2001: 未解決の外部シンボルが発生するのはなぜですか? 私の問題は似ていますが、私の問題は static instanceの定義にはありません。私の問題は、静的GetInstance()定義を別のクラスから解決することです。

私のエラーは違うように見えるか、以前の回答が不十分です。「クラス外で s_instance を定義する必要があります」という提案を試しましたが、これは cpp 初心者としては意味がありません。ヘッダーで静的を宣言し、cpp での実装も定義します。

また、シングルトンのスレッド セーフに関する講義も必要ありません。ハンドラー バインディングはシグナル 2 を使用します...

State.h

class State
{   
public: 
    State(void);
    ~State(void);

    static State* instance; 
    static State* GetInstance(); 
... 

};

状態.cpp

State::AppState mCurrentState;
boost::signals2::signal<void ()> mSignal;


State* instance = NULL;
State* GetInstance()
{
    if( instance == NULL)
    {
        instance = new State();
        return instance;
    }
    else
    {
        return instance;
    }
}

すべてが正常にコンパイルされます。次に、このようにシングルトンにアクセスしようとすると、 State *state = State::GetInstance();「未解決の外部シンボル」エラーが発生します。

エラー LNK2019: 未解決の外部シンボル "public: static class State * __cdecl State::GetInstance(void)" (?GetInstance@State@@SAPAV1@XZ) 関数で参照されている "public: virtual void __thiscall MesherApp::setup(void)" (?setup@MesherApp@@UAEXXZ)

「クラス外で定義する」と言う人もいるので、次のことも試しました-それはどういう意味ですか?

class State
{
   public:
   ...
}
static State* instance; 
static State* GetInstance(); 

この質問を見ると、 フィールドを持つ静的メソッドこれがどのように適用されるのかわかりません。.h で宣言し、cpp ファイルですべてを定義しています。

4

2 に答える 2

5

単純化できますか?

class State
{
   public:

      static State& GetInstance() 
      {
          static State _instance; 
          return _instance;
      }
};

非表示で、オンデマンドで、スレッドセーフで、フープジャンプせずに動作します。

静的な初期化により、instance == NULL追加の労力なしで同等のものが保証されます。また、プロセスのシャットダウン時 (前) に適切な破棄を保証します (正常終了を想定)。

これが行った唯一の前提は、シングルトンインスタンスを「強制的に」リセットしたくないということです。

于 2013-09-12T22:34:57.950 に答える