1

リンカ エラー メッセージ "private: static class Worlds::Game * Worlds::Game::instance"
以下は、エラーに関連するコード セグメントです。

Game.h から

static Worlds::Game* instance;
static Worlds::Game* getInstance();

Game.cpp から

Worlds::Game* instance = 0;

Worlds::Game* Worlds::Game::getInstance()
{
    if (instance)
    {
        return instance;
    }
    else
    {
        return instance = new Worlds::Game();
    }
}

私の質問は、ゲームクラスのシングルトンを作成するためにすべてのベースをカバーする必要があるのに、なぜこのエラーが発生するのですか?

編集:

Game.cpp に追加するのを忘れていました。何かを行う Game の関数を呼び出す必要があるすべての Glut コールバックがあります。

void onKeyDownCallback(unsigned char key, int mouseX, int mouseY)
void onKeyUpCallback(unsigned char key, int mouseX, int mouseY)
void timerCallback(int value)
void onWindowReshapeCallback(int w,int h)
void onMouseClickedCallback(int button, int state, int mouseX, int mouseY)
void onMouseMovedCallback(int deltaX, int deltaY)
void displayCallback()
4

2 に答える 2

2

static Worlds::Game* instance;- これをヘッダーから削除します。instanceがマークされているためstatic、翻訳単位ごとにコピーされます。そして、翻訳された単位と同じ数のインスタンスを取得します。ただし、1 つの翻訳単位でのみ初期化します

singleton次の方法で実装することも検討してください。

Worlds::Game & Worlds::Game::getInstance()
{ 
    static Game instance;
    return instance;
}
于 2012-08-09T13:58:25.750 に答える
1

C++ では、staticキーワードには 2 つの意味があります。

クラス内で使用される場合、オブジェクトのインスタンスなしで呼び出すことができる「静的変数」または「静的メソッド」を意味します。

ただし、コード ファイルのルート スペースでクラス本体の外で使用すると、意味が変わります。この場合、単純な古い C の意味が使用されます。「静的」でマークされたシンボルは、他のモジュールによってリンクされないように隠されています。

つまり、.h ファイルをそのように定義し、その .h ファイルをいくつかの .cpp モジュールに #include すると、他のモジュールは「インスタンス」または「getInstance」の実装を参照しません。

ルート コード スコープから「静的」を削除すれば問題ありません。

于 2012-08-09T13:58:48.403 に答える