我在构造函数中增加了一个静态类成员。根据规则,它在类中声明并在外部定义。这应该是完全合法的。任何想法为什么我会收到重复的符号错误?
class Player
{
private:
static int numPlayers;
public:
Player() { numPlayers++; }
};
int Player::numPlayers = 0;
我在构造函数中增加了一个静态类成员。根据规则,它在类中声明并在外部定义。这应该是完全合法的。任何想法为什么我会收到重复的符号错误?
class Player
{
private:
static int numPlayers;
public:
Player() { numPlayers++; }
};
int Player::numPlayers = 0;
问题是您没有将您的声明与定义分开。考虑:
类播放器 { 私人的: 静态 int numPlayers; 上市: 播放器() { numPlayers++; } };
上面的代码只是在“Player”类中声明了“numPlayers”的存在。但是,它不保留任何空间或将内存地址分配给变量“Player::numPlayers”。然而:
int Player::numPlayers = 0;
上面的代码是一个定义——它为对象 Player::numPlayers 保留空间并为该对象指定一个唯一的地址。该行在程序中多次出现违反了单一定义规则。现在最有可能发生的是您正在包含此文件...
您永远不应该包含“.c”、“.cpp”、“.m”、“.mm”或任何其他“源”文件(即包含定义的文件)。您应该只包括“头”文件(即包含纯粹声明的文件)。对于包括 Xcode 在内的许多构建系统,每个源文件都会自动编译并链接到项目中。如果您包含来自另一个源文件的源文件,那么定义会被链接两次——第一次是在它自己编译时,然后在另一个源文件引用它时再次链接。
由于您在询问 Xcode ...您可以通过取消选中项目详细信息视图中的源文件来解决此问题;源文件旁边的复选标记表示它将为当前目标编译和链接。但是,我强烈建议您检查“.mm”文件,创建一个“.h”文件来放置您的声明,并包含“.h”文件而不是包含另一个源文件。
你定义了多次吗?即在头文件中定义它并包含在多个cpp文件中。