这是来自 C++20 规范 ( [basic.life]/8 )的代码示例:
struct C {
int i;
void f();
const C& operator=( const C& );
};
const C& C::operator=( const C& other) {
if ( this != &other ) {
this->~C(); // lifetime of *this ends
new (this) C(other); // new object of type C created
f(); // well-defined
}
return *this;
}
int main() {
C c1;
C c2;
c1 = c2; // well-defined
c1.f(); // well-defined; c1 refers to a new object of type …Run Code Online (Sandbox Code Playgroud) 我需要在类中实现重载赋值运算符,这样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一样.真相是什么?
此外,玩家还可以引用银行作为会员.我应该只通过=来分配参考吗?那么复制构造函数的目的是什么?
我正在尝试在我的环境游戏中创建我的类 Wanderer 的流浪者属性。
\n我在环境游戏 hpp 文件中声明它:
\nWanderer gaspard;
然后我在 GameEnvironment cpp 文件中初始化它:
\nvoid GameEnvironment::initWanderer()\n{\n this->gaspard = Wanderer(this->_magic, this->_sphere, this->_textureProgram);\n}\nRun Code Online (Sandbox Code Playgroud)\n我有这个错误:\nin gameEnvironment
\n\n\n使用已删除函数 \xe2\x80\x98Wanderer& Wanderer::operator=(Wanderer&&)\xe2\x80\x99GCC\nWanderer.hpp(12, 7): \xe2\x80\x98Wanderer& Wanderer::operator=(Wanderer&&)\xe2 \x80\x99 被隐式删除>因为默认定义格式不正确:
\n
在流浪者
\n\n\n使用已删除函数 \xe2\x80\x98Object& Object::operator=(Object&&)\xe2\x80\x99GCC\nObject.hpp(13, 7): \xe2\x80\x98Object& Object::operator=(Object&&)\xe2 \x80\x99 被隐式删除,因为 >default 定义格式不正确:
\n
在对象中
\n\n\n非静态引用成员\xe2\x80\x98ObjectProgram& Object::_program\xe2\x80\x99,可以\xe2\x80\x99t使用默认>赋值运算符GCC
\n
如果我声明std::vector<Wanderer> gaspard;\n然后我在我的初始化函数中推回一个流浪者\n this->gaspard = Wanderer(this->_magic, this->_sphere, this->_textureProgram);\n它可以工作。但我只需要一个流浪者,所以拥有向量并不是一个很好的选择。
这是 Wanderer 类:
\nclass Wanderer : public Object …Run Code Online (Sandbox Code Playgroud)