C++ 叮当声:错误:链接器命令在C+;中失败,退出代码为1(使用-v查看调用)+;代码

C++ 叮当声:错误:链接器命令在C+;中失败,退出代码为1(使用-v查看调用)+;代码,c++,xcode,class,C++,Xcode,Class,在下面的代码中,在void Player::chooseDiscard中,我试图将类卡的丢弃值分配给同一类的discardList数组,但编译器识别它就像对“Player::discardList”的未定义引用一样。。我怎样才能防止这个错误 class Player { public: Player(); virtual void chooseDiscard(int); void replenish( ); vector<Card>allCards; friend

在下面的代码中,在
void Player::chooseDiscard
中,我试图将类卡的丢弃值分配给同一类的discardList数组,但编译器识别它就像
对“Player::discardList”的未定义引用一样。
。我怎样才能防止这个错误

class Player
{
public:
  Player();
  virtual void chooseDiscard(int);
  void replenish( );
  vector<Card>allCards;
  friend ostream& operator<<(ostream& os, Card hand);
  int selfIndex;      //index within player vector, starting with 0 for the human
  vector<Card>hand;   //holds 7 cards
protected:
  int takeFrom;       //player supplying new Car
  Card discard;       //card being discarded
  int discardIndex;   //position within hand of card being discarded
  static Card discardList[];
};
void Player::chooseDiscard(int number)
{
  discard = hand[number-97];
  discardIndex = number-97;
  discardList[selfIndex] = discard;
}
职业玩家
{
公众:
Player();
虚拟void-chooseDiscard(int);
虚空补充();
矢量卡;

friend ostream&operator您声明了
discardList
作为类
Player
的静态数据成员,但是这样做并不是定义它

C++标准ISO的标准如下: 静态数据成员在其类定义中的声明不是定义,可能是不完整的 除cv限定void之外的类型。静态数据成员的定义应出现在命名空间中 包含成员的类定义的作用域。在命名空间作用域的定义中,静态 数据成员应使用::运算符通过其类名进行限定

因此编译器(实际上是链接器抱怨)报告未定义引用是正确的,因为从未定义过
discardList

您应该做的是定义
discardList
在类
Player
的范围之外,类似于:

Card Player::discardList[] = {/* PUT SOME Card objects IN HERE*/};

使用C数组可能会有很大的限制,因为它有一个固定的大小,但是如果您知道
discardList
永远不会增长或收缩,那么使用C数组可能会非常有效。否则,使用std::vector是更好的选择。

按照某人的建议,用向量替换数组也没有帮助。