当我们在visual Studio 中编译时,经常会发生这两个错误,通常这两个错误是同时产生的。
产生原因
找到一个或多个多重定义的符号
生成因一个或多个符号的多个定义而失败。 该错误之前为错误 LNK2005。
通常情况下,是因为不正确的使用导致的 变量或者函数名重名
解决方案:
- 定位到错误的地点
在LNK2005的错误的说明中可以找到
错误 LNK2005 “private: static class GameMap * GameMap::ga_me” (?ga_me@GameMap@@0PEAV1@EA) 已经在 bigHomework.obj 中定义 Project1 …\Main.obj 1 - 删除部分代码,找到重定义所在
因为一般情况下可能看不出来,所以尽量减少对应的变量名或者函数名,直到正确编译。
提供一个我遇到的情况:
class GameMap {
private:
static GameMap* ga_me;
char gamemap[21][21];
GameMap() { memset(gamemap, 0, sizeof(gamemap)); }
~GameMap() { if (ga_me != NULL)delete ga_me; }
public:
static
GameMap* getInstance() {
if (ga_me == NULL) {
ga_me = new GameMap();
}
return ga_me;
}
};
GameMap* GameMap::ga_me = NULL;//去掉这句话就是正确的
错误说明:
当初始化类中的static变量是,必须在类外指定值。
在单例模式中初始化GameMap* GameMap::ga_me = NULL;
时算是一次对变量名的定义
在ga_me = new GameMap();
也当做了一次对变量名的重新定义。
因此,就产生了这两个错误。
我的改正办法是:
直接删掉GameMap* GameMap::ga_me = NULL;
因为在指针没有显式初始化的情况下,默认的初始化为NULL
,程序能够正确。