根据之前提出的问题:vector::erase with pointer member,Remove elements of a vector inside the loop,我仍然需要一些关于vector.erase函数的帮助。我被指示实现一个复制构造函数,使擦除函数在向量上起作用,这在另一个问题中也有提到。在我的相关类中实现一个函数运算符是很重要的。在这样做时,我得到了另一个关于创建复制构造函数的错误,我找不到原因。错误是“Player :: Player(const Player& otherPlayer)不提供初始化器:”。我究竟做错了什么?考虑到Player包含作为类成员的map,指针和引用(bank是一个引用)。是否适合初始化的简单任务?
我该怎么办?
class Player
{
public:
Player(int,int,string, Bank&);
Player(const Player&);
Player& operator = (const Player& rhs);
Player::Player(const Player& otherPlayer)
{
ID = otherPlayer.ID;
pName = otherPlayer.pName;
pMoney = otherPlayer.pMoney;
doubleIndicator = otherPlayer.doubleIndicator;
position = otherPlayer.position;
bank = otherPlayer.bank;
colBought = otherPlayer.colBought;
housesColBuilt = otherPlayer.housesColBuilt;
}
更新 我在执行operator = as时发出警告:“返回本地变量的地址或临时变量”。这会引起真正的问题吗?如果是这样,我怎么能修改它来克服这个?
Player& Player::operator=(const Player& rhs)
{
return Player(rhs);
}
通过这种方式,我仍然收到一个警告:递归函数会导致堆栈溢出:
Player& Player::operator=(const Player& rhs)
{
*this = Player(rhs);
return *this;
}
任何提示?
答案 0 :(得分:3)
您必须使用构造函数中的成员初始值设定项初始化属于类成员的引用:
Player::Player(const Player& otherPlayer) :
bank(otherPlayer.bank)
{
//...
}
这是必需的,否则引用将是未初始化的,这是不允许的。
请注意,赋值bank = otherPlayer.bank;
做了不同的事情:它分配引用的对象,而不是设置引用本身。
以相同的方式初始化其他成员(即使它们不是引用)也是一种好的样式,因为它可以导致更优化的代码(否则成员可能在被分配之前被默认构造)。