【问题标题】:Implement a copy constructor for the erase function of vector为vector的erase函数实现一个拷贝构造函数
【发布时间】:2012-01-27 15:10:56
【问题描述】:

基于以前的问题产生的问题:vector::erase with pointer memberRemove elements of a vector inside the loop,我仍然需要一些有关 vector.erase 功能的帮助。我被指示实现一个复制构造函数以使擦除函数在向量上工作,另一个问题中也提到了这一点。在我的相关类中实现函数运算符是必不可少的。这样做时,我在创建复制构造函数时遇到另一个错误,我找不到很长时间的原因。错误是“Player::Player(const Player& otherPlayer) does not provide an initiallizer for:”。我究竟做错了什么?考虑到 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= 时收到警告:“返回局部变量或临时地址的地址”。这会引起真正的问题吗?如果是这样,我该如何修改它来克服这个问题?

Player& Player::operator=(const Player& rhs)
{
return Player(rhs);
}

这样,我还是收到了递归函数会导致堆栈溢出的警告:

Player& Player::operator=(const Player& rhs)
{
*this = Player(rhs);
return *this;
}

有什么提示吗?

【问题讨论】:

  • 回复:更新。是的,这是一个真正的问题。 1)你不执行任何任务。 2) 您返回对无效对象的引用。 (如果您认为它有其他用途,则返回值仅允许链接。)
  • 我需要什么样的作业?为什么我需要复制构造函数?难道所有的操作都不能在operator=的函数里面进行吗?

标签: c++ vector constructor erase


【解决方案1】:

您必须在构造函数中使用成员初始化器来初始化作为类成员的引用:

Player::Player(const Player& otherPlayer) : 
    bank(otherPlayer.bank)
{
    //...
}

这是必需的,否则引用将未初始化,这是不允许的。

请注意,赋值 bank = otherPlayer.bank; 做了一些不同的事情:它分配被引用的对象,而不是设置引用本身。

以同样的方式初始化其他成员(即使它们不是引用)也是一种很好的方式,因为它可以产生更优化的代码(否则成员可以在分配之前默认构造)。

【讨论】:

  • 其他的都可以用同样的方式初始化。
猜你喜欢
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 2015-06-08
相关资源
最近更新 更多