重载赋值运算符会导致有关递归的警告

arj*_*soh 2 c++ operator-overloading multimap erase

我需要在类中实现重载赋值运算符,这样vector.erase函数将按照" vector :: erase with pointer member " 的答案中的建议正常工作.为了同样的目的,我也实现了一个复制构造函数.通过以下操作符的实现,我得到警告:

'Player :: operator =':在所有控制路径上递归,函数将导致运行时堆栈溢出.

显然执行Player::operator=是不正确的.什么是正确的实施?

//Copy constructor:
Player::Player(const Player& otherPlayer) {
   ...
}


Player& Player::operator=(const Player& rhs) {
    *this = Player(rhs);
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

多图的擦除功能是否与向量的工作方式相同?当我在multimap中使用时,我没有收到关于没有实现重载的错误,operator=就像vector一样.真相是什么?

此外,玩家还可以引用银行作为会员.我应该只通过=来分配参考吗?那么复制构造函数的目的是什么?

Tom*_*Tom 7

你的问题是这一行:

*this = Player(rhs);
Run Code Online (Sandbox Code Playgroud)

这会再次调用overloaded =方法,从而产生递归循环.您应该分别指定所有成员:

x = rhs.x;
y = rhs.y; // for example
Run Code Online (Sandbox Code Playgroud)

编辑另请注意,由于您传递的对象与实例方法所属的对象类型相同,因此您可以像访问公共成员一样访问私有成员.

EDIT2据我所知,您不希望复制引用,因为这意味着可以从两个对象访问相同的Bank对象,这会破坏封装并可能导致一些意外问题.您是否有使用指针的具体原因?如果bank对象是指针,你可以重载bank的=运算符,然后正常分配:

bank = rhs.bank;
Run Code Online (Sandbox Code Playgroud)

至于复制构造函数和赋值运算符的区别,快速谷歌搜索出现了这个链接:http: //prashanth-cpp.blogspot.com/2007/01/assignment-operator-vs-copy-constructor.html