c++ - 为vector的删除函数实现一个拷贝构造函数

标签 c++ vector constructor erase

基于之前的问题产生的问题: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/

相关文章:

c++ - 如何将 `CString` 转换为 `CHAR *` ?

C++ 11 std::vector push_back 方法多次调用 copy/dest?

c++ - function(vector<int> v) 和 function(vector<int>& v) 有什么区别?

java在子类构造函数中初始化基类字段

Python 在没有 __init__ 的情况下触发 __new__?

c++ - 代码的有效性

c++ - Q-learning学习扫雷行为

c++ - 用于快速插入和查找n维实 vector 的适当容器(提供了初始基准测试)

c++ - 无法将值存储到 vector 结构中

c++ - 构造函数中虚函数的奇怪行为