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

问题描述:

我试图将Singleton设计模式为我的代码,但我开始一个奇怪的错误:C++:静态成员函数和变量 - 重新定义静态变量?

main.obj : error LNK2005: "private: static class gameState * gameState::state" ([email protected]@@[email protected]) 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)" ([email protected]@[email protected]) referenced in function "void __cdecl `dynamic initializer for 'private: static class gameState * gameState::state''(void)" ([email protected]@@[email protected]@@YAXXZ) 

任何好的建议,就如何解决一个以及?

感谢你们俩,其固定:d

你需要把静态gameState*定义成一个源文件,即该行:

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

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

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

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

private: 
gameState() 
{ 
} 

为重定义问题使用头文件保护宏,并明确定义您的私有构造函数。