Old*_*her 3 c++ xcode static-members duplicate-symbol
我有一个静态类成员在构造函数中递增.根据规则,它在类中声明并在外部定义.这应该是完全合法的.任何想法为什么我得到一个重复的符号错误?
class Player
{
private:
static int numPlayers;
public:
Player() { numPlayers++; }
};
int Player::numPlayers = 0;
Run Code Online (Sandbox Code Playgroud)
Mic*_*yan 10
问题是你没有将你的宣言与你的定义分开.考虑:
class Player
{
private:
static int numPlayers;
public:
Player() { numPlayers++; }
};
上面的代码仅仅声明"Player"类中存在"numPlayers".但是,它不保留任何空间或为变量"Player :: numPlayers"分配内存地址.然而:
int Player::numPlayers = 0;
上面的代码是一个DEFINITION - 它为对象Player :: numPlayers保留空间,并为该对象指定一个唯一的地址.让该行在程序中出现多次违反了one-definition-rule.现在最有可能发生的事情就是你要包含这个文件......
你永远不应该包括".c",".cpp",".m",".mm"或任何其他"源"文件(即包含定义的文件).您应该只包含"标题"文件(即包含纯粹DECLARATIONS的文件).对于许多构建系统,包括Xcode,每个源文件都会自动编译并链接到项目中.如果您包含来自另一个源文件的源文件,那么定义将被链接两次 - 首先是在它自己编译时,然后在另一个源文件引用时再次链接.
既然您在询问Xcode ......您可以通过在项目详细信息视图中取消选中源文件来解决此问题; 源文件旁边的复选标记表示它将被编译并链接到当前目标.但是,我强烈建议您选中".mm"文件,创建一个".h"文件,在其中放置声明,并包含".h"文件,而不是包含另一个源文件.