Zep*_*pee 2 c++ static-members redefinition
我试图将Singleton设计模式合并到我的代码中,但我开始遇到一个奇怪的错误:
main.obj : error LNK2005: "private: static class gameState * gameState::state" (?state@gameState@@0PAV1@A) already defined in gameState.obj
Run Code Online (Sandbox Code Playgroud)
如果您不熟悉单例模式,它基本上只用于在整个程序中强制执行某个对象的1个实例.以下是相关代码:gameState.h:
class gameState
{
public:
static gameState* Instance() {return state;}
.
.
.
private:
gameState();
static gameState* state;
};
gameState* gameState::state = new gameState();
Run Code Online (Sandbox Code Playgroud)
现在我只是在main.cpp文件中使用该对象的实例:
gameState *currState = gameState::Instance();
.
.
.
for_each(currState->getHumanPieces().begin(),currState->getHumanPieces().end(), drawPieces);
Run Code Online (Sandbox Code Playgroud)
看起来我试图重新定义gameState :: state,但无法弄清楚为什么......帮助任何人?
解决了这个问题,但仍然存在一个错误,我之前并没有真正发布,因为我认为它只是另一个错误的一部分:
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)
Run Code Online (Sandbox Code Playgroud)
关于如何解决这个问题的任何好的提示?
谢谢你们两位,修好了:D
您需要将static的定义放在gameState*一个源文件中,即此行:
gameState* gameState::state = new gameState();
Run Code Online (Sandbox Code Playgroud)
如果将其放在多个源文件包含的标题中,则每个源文件的定义都会gameState::state在链接时导致错误.
对于后续问题,请使用Vadakkumpadaths建议:您需要为gameStates构造函数提供定义,而不仅仅是声明.