C ++:静的メンバー関数と変数-静的変数の再定義?
-
08-07-2019 - |
質問
シングルトンデザインパターンをコードに組み込むことを試みていましたが、奇妙なエラーが発生し始めました:
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()
{
}
再定義の問題にはヘッダーガードマクロを使用し、プライベートコンストラクターを明示的に定義します。
所属していません StackOverflow