2

我试图将 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

4

3 回答 3

8

您需要将静态的定义gameState*完全放入一个源文件中,即这一行:

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

如果你把它放在一个包含多个源文件的头文件中,每个源文件都有一个定义gameState::state,导致链接时错误。

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

于 2009-11-30T01:27:46.247 回答
3

为您的构造函数添加定义以修复第二个链接器错误。

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

对重定义问题使用标头保护宏,并显式定义您的私有构造函数。

于 2012-11-07T06:10:15.673 回答