【问题标题】:deep copy problems in C++C++中的深拷贝问题
【发布时间】: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


【解决方案1】:

你的问题是你没有声明参数const。应该是这样的:

Rectangle& Rectangle::operator=(const Rectangle &rhs)

【讨论】:

  • 是的,就是这样。你能告诉我为什么会这样吗?
  • 我的意思是,除了 C++ 是一个残酷的情妇。
  • @ScubaSteve 对“为什么”问题的字面回答是标准禁止这样做。如果您对此不满意,请查看此处的讨论:stackoverflow.com/questions/1565600/…
  • 即使只知道这些类型的重载会创建临时对象,并且如果没有 const 就无法引用它们,也是非常有帮助的。再次感谢。
  • 请注意,创建临时对象的不是赋值运算符,而是 'm_boundingBox =' 右侧的 Rectangle(x,y,width,height) 声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2015-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多