我试图将Singleton设计模式整合到我的代码中,但是我开始遇到一个奇怪的错误:

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,但不知道为什么...帮助任何人?

解决了这个问题,但仍然存在一个错误,我之前从未真正发布过,因为我认为这只是另一个错误的一部分:
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*的定义恰好放入一个源文件中,即此行:

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

如果将其放在多个源文件包含的 header 中,则每个 header 都有gameState::state的定义,这会在链接时导致错误。

对于后续问题,请使用Vadakkumpadaths的建议:您需要提供gameState的构造函数的定义,而不仅仅是声明。

关于c++ - C++:静态成员函数和变量-重新定义静态变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1817445/

10-11 23:22
查看更多