C++ 排序不是移动向量的元素

C++ 排序不是移动向量的元素,c++,copy,operator-overloading,C++,Copy,Operator Overloading,目标很简单,我有一个带有宽度、高度和面积属性的Rectangle类。我为设置了一个运算符重载。您的比较仅使用m_区域——正如所指出的,您没有在“复制运算符”中设置该值。因此,它不是初始化的,并且对于所有赋值构造的实例都是“相同的”——因此没有排序 根据您创建示例数据的方式,它们都有一个未初始化的m\u区域 像这样解决它: Rectangle & Rectangle::operator=(const Rectangle & rhs) { if (this != &am

目标很简单,我有一个带有宽度、高度和面积属性的
Rectangle
类。我为
设置了一个运算符重载。您的比较仅使用
m_区域
——正如所指出的,您没有在“复制运算符”中设置该值。因此,它不是初始化的,并且对于所有赋值构造的实例都是“相同的”——因此没有排序

根据您创建示例数据的方式,它们都有一个未初始化的
m\u区域

像这样解决它:

 Rectangle & Rectangle::operator=(const Rectangle & rhs)
 {
     if (this != &rhs)
     {
         m_width = rhs.m_width;
         m_height = rhs.m_height;
         m_area = rhs.m_area;    // FIX 
     }
     return *this;
}

指出使用自动生成的实现可以自己正确地处理这个问题,因此如果没有压力环境导致您自己实现这些,请将两者都删除。

您可以让编译器为您实现副本构造和赋值。它不太可能引入琐碎的错误。为什么不在赋值运算符中复制该区域?您的问题无法从该代码片段中重现=>无帮助真正的修复程序很可能不会实现复制和赋值。@juanchopanza同意-或者修复它
 Rectangle & Rectangle::operator=(const Rectangle & rhs)
 {
     if (this != &rhs)
     {
         m_width = rhs.m_width;
         m_height = rhs.m_height;
     }
     return *this;
}
bool Rectangle::operator<(const Rectangle & rhs)
{
    return (m_area > rhs.m_area);
}
// rects is a vector<Rectangle> with several rectangles in it
std::sort(rects.begin(), rects.end());
 Rectangle & Rectangle::operator=(const Rectangle & rhs)
 {
     if (this != &rhs)
     {
         m_width = rhs.m_width;
         m_height = rhs.m_height;
         m_area = rhs.m_area;    // FIX 
     }
     return *this;
}