基于之前的问题产生的问题:vector::erase with pointer member , Remove elements of a vector inside the loop ,我仍然需要一些关于 vector.erase 函数的帮助。我被指示实现一个复制构造函数以使删除函数在 vector 上工作,另一个问题中也提到了这一点。在我的相关类中实现函数运算符是必不可少的。在这样做时,我在创建复制构造函数时遇到另一个错误,我找不到很长时间的原因。错误是“Player::Player(const Player& otherPlayer) does not provide an initializer for:”。我究竟做错了什么?考虑到 Player 包含作为类成员的映射、指针和引用(银行是引用)。一个简单的赋值是否足以进行初始化?
我该怎么办?
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= 的实现点收到警告:“返回局部变量或临时变量的地址”。这会引起真正的问题吗?如果是这样,我该如何修改它来克服这个问题?
Player& Player::operator=(const Player& rhs)
{
return Player(rhs);
}
这样,还是收到递归函数会导致栈溢出的警告:
Player& Player::operator=(const Player& rhs)
{
*this = Player(rhs);
return *this;
}
有什么提示吗?
最佳答案
您必须在构造函数中使用成员初始值设定项来初始化作为类成员的引用:
Player::Player(const Player& otherPlayer) :
bank(otherPlayer.bank)
{
//...
}
这是必需的,否则引用将未初始化,这是不允许的。
请注意,分配 bank = otherPlayer.bank;
做了一些不同的事情:它分配被引用的对象,而不是设置引用本身。
以相同的方式初始化其他成员(即使它们不是引用)也是一种很好的风格,因为它可以导致更优化的代码(否则成员可以在分配之前默认构造)。
关于c++ - 为vector的删除函数实现一个拷贝构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8629931/