【发布时间】:2021-06-20 02:09:06
【问题描述】:
所以我有一个类 Rectangle,其重载 operator= 定义如下:
Rectangle& Rectangle::operator=(Rectangle &rhs)
{
if (this != &rhs)
{
m_x = rhs.m_x;
m_y = rhs.m_y;
m_width = rhs.m_width;
m_height = rhs.m_height;
m_intersection = rhs.m_intersection;
}
return *this;
}
到目前为止,编译器没有抱怨。但是当我尝试做一个作业时,我的编译器抱怨:
m_boundingBox = Rectangle(x, y, width, height);
现在我试图避免调用 new,因此以这种方式分配。我假设我需要为这种分配实现一个单独的复制构造函数,但我不知道签名应该是什么样子。
这是编译器错误: 错误(活动) E0349 没有运算符“=”匹配这些操作数
首先,我想解决上述问题。但其次,如果你能对这个困惑的代码编写猿的整个主题有所了解,那就太棒了。教人钓鱼等等。
【问题讨论】:
-
您的
operator=不会更改右侧,对吗?所以让它接受const Rectangle&而不是Rectangle&然后它就可以接受临时变量作为参数。请参阅here 以讨论潜在问题,尽管是在声明变量而不是函数参数的上下文中。 -
您知道,由普通旧值类型组成且没有任何指针的类不需要重载运算符。默认编译器生成的赋值运算符函数将为您复制每个单独的成员。因此,虽然指导您将
rhs作为const参考传递的其他答案是正确的,但更简单的解决方案是删除您的客户operator=方法。 -
在
m_boundingBox = Rectangle(x, y, width, height)中,右侧创建一个临时的。临时只能绑定到const引用。您的复制分配运算符接受非const引用。更改您的operator=(),使其接受const引用。 (另外,如果Rectangle的所有成员都可以被分配(从你定义Rectangle::operator=()的方式来看似乎是这种情况,那么你根本不需要它——编译器提供的默认值@987654338 @ 就足够了。 -
@ScubaSteve 如果你想了解更多关于默认生成的构造函数:The rule of three/five/zero
-
@ScubaSteve 在书籍方面,我认为 Scott Meyers 的 Effective C++ 系列可能是一本不错的
标签: c++ visual-c++ deep-copy