2

シングルトンデザインパターンをコードに取り込もうとしていましたが、奇妙なエラーが発生し始めました。

main.obj : error LNK2005: "private: static class gameState * gameState::state" (?state@gameState@@0PAV1@A) already defined in gameState.obj

シングルトンパターンに慣れていない場合は、基本的に、プログラム全体で特定のオブジェクトの1つのインスタンスのみを強制するために使用されます。関連するコードは次のとおりです。gameState.h:

class gameState
{
public:
static gameState* Instance() {return state;}
.
.
.
private:
gameState();
    static gameState* state;
};
gameState* gameState::state = new gameState();

そして今、私はmain.cppファイルでそのオブジェクトのインスタンスを使用しています:

gameState *currState = gameState::Instance();
.
.
.
for_each(currState->getHumanPieces().begin(),currState->getHumanPieces().end(), drawPieces);

gameState :: stateを再定義しようとしているように見えますが、理由がわかりません...誰かを助けますか?

それはそれを解決しましたが、1つのエラーがまだ残っています。これは、他のエラーの一部であると思ったため、以前は実際に投稿していませんでした。

error LNK2019: unresolved external symbol "private: __thiscall gameState::gameState(void)" (??0gameState@@AAE@XZ) referenced in function "void __cdecl `dynamic initializer for 'private: static class gameState * gameState::state''(void)" (??__E?state@gameState@@0PAV1@A@@YAXXZ)

それを修正する方法についての良いヒントはありますか?

両方に感謝します、その固定:D

4

3 に答える 3

8

gameState*スタティックの定義を正確に1つのソースファイルに入れる必要があります。つまり、次の行です。

gameState* gameState::state = new gameState();

複数のソースファイルに含まれているヘッダーに配置すると、それぞれgameState::stateにリンク時にエラーが発生する定義があります。

フォローアップの問題については、VadakkumpadathsのgameStateアドバイスを使用してください。宣言だけでなく、コンストラクターの定義を提供する必要があります。

于 2009-11-30T01:27:46.247 に答える
3

コンストラクターの定義を追加して、2番目のリンカーエラーを修正します。

private:
gameState()
{
}
于 2009-11-30T01:41:37.837 に答える
2

再定義の問題にはヘッダーガードマクロを使用し、プライベートコンストラクターを明示的に定義します。

于 2012-11-07T06:10:15.673 に答える