質問

シングルトンデザインパターンをコードに組み込むことを試みていましたが、奇妙なエラーが発生し始めました:

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

役に立ちましたか?

解決

静的 gameState * の定義を1つのソースファイル、つまり次の行に含める必要があります。

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

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

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

他のヒント

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

private:
gameState()
{
}

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top