在XCode中定义静态类变量时出现C ++ Duplicate Symbol错误

时间:2009-12-07 08:15:04

标签: c++ xcode static-members duplicate-symbol

我在构造函数中增加了一个静态类成员。根据规则,它在类中声明并在外部定义。这应该是完全合法的。任何想法为什么我得到重复的符号错误?

class Player
{
   private:
      static int numPlayers;
   public:
      Player() { numPlayers++; }
};

int Player::numPlayers = 0;

2 个答案:

答案 0 :(得分:10)

问题是你没有将你的宣言与你的定义分开。考虑:

class Player
{
   private:
      static int numPlayers;
   public:
      Player() { numPlayers++; }
};

上面的代码仅仅声明“Player”类中存在“numPlayers”。但是,它不保留任何空间或为变量“Player :: numPlayers”分配内存地址。但是:

int Player::numPlayers = 0;

上面的代码是一个定义 - 它为对象Player :: numPlayers保留空间,并为该对象指定一个唯一的地址。让该行在程序中出现多次违反了one-definition-rule。现在最有可能发生的事情就是你要包含这个文件......

你永远不应该包括“.c”,“。cpp”,“。m”,“。mm”或任何其他“源”文件(即包含定义的文件)。您应该只包含“标题”文件(即包含纯粹DECLARATIONS的文件)。对于许多构建系统,包括Xcode,每个源文件都会自动编译并链接到项目中。如果您包含来自另一个源文件的源文件,那么定义将被链接两次 - 首先是在它自己编译时,然后在另一个源文件引用时再次链接。

由于您在询问Xcode ...您可以通过在项目详细信息视图中取消选中源文件来解决此问题;源文件旁边的复选标记表示它将被编译并链接到当前目标。但是,我强烈建议您选中“.mm”文件,创建一个“.h”文件,在其中放置声明,并包含“.h”文件,而不是包含另一个源文件。

答案 1 :(得分:1)

你多次定义了吗?即在头文件中定义它并包含在多个cpp文件中。