C++:静态成员函数和变量——静态变量的重新定义?

标签 c++ static-members redefinition

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

main.obj : error LNK2005: "private: static class gameState * gameState::state" (?state@gameState@@0PAV1@A) already defined in gameState.obj

如果您不熟悉单例模式,它基本上用于强制整个程序中某个对象只有 1 个实例。 这是相关代码: 游戏状态.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();

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

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

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

相关文章:

c# - 为什么不能在静态方法中使用关键字 'this'?

C++ 使用类的静态成员时,什么可能会导致链接过程中出现 Unresolved external 错误?

haskell - 类型类实例重新定义

c++ - C++ 中的多个 return 语句和性能

c++ - 为什么除了 char 之外的内置类型 sizeof 在 C 和 C++ 中依赖于编译器?

java - NullPointerException 或将打印静态变量的内容

c++ - 如何仅包含一次文件/防止 C++ 程序中旧 C API 中的函数重新定义

c++ - 如何完全删除二维指针数组

c++ - 在运行时用一个小部件替换另一个小部件并显示新的小部件

C链表 "redefinition of structure"