4

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

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

int Player::numPlayers = 0;
4

2 回答 2

10

问题是您没有将您的声明与定义分开。考虑:

类播放器
{
   私人的:
      静态 int numPlayers;
   上市:
      播放器() { numPlayers++; }
};

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

int Player::numPlayers = 0;

上面的代码是一个定义——它为对象 Player::numPlayers 保留空间并为该对象指定一个唯一的地址。该行在程序中多次出现违反了单一定义规则。现在最有可能发生的是您正在包含此文件...

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

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

于 2009-12-07T09:09:04.490 回答
1

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

于 2009-12-07T08:18:07.703 回答