目标很简单,我有一个Rectangle
类,包含宽度,高度和面积属性。我为<
运算符设置了运算符重载,因为这是std::sort
用于它的比较。
根据我到目前为止在网上找到的内容,似乎这个问题通常源于复制操作符或类的构造函数中的错误。
这是Rectangle
类的复制构造函数:
Rectangle::Rectangle(const Rectangle & other)
{
m_width = other.m_width;
m_height = other.m_height;
m_area = other.m_area;
}
这是我的复制操作员:
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);
}
最后,这是我如何调用sort方法,以防万一:
// rects is a vector<Rectangle> with several rectangles in it
std::sort(rects.begin(), rects.end());
我认为我正在做的一切正确,但任何帮助表示赞赏!
答案 0 :(得分:1)
您的比较仅使用m_area
- 正如@Galik指出的那样,您在“复制运算符”中设置 。因此,对于所有赋值构造的实例,它没有被初始化和“相同” - 因此没有排序。
根据您创建示例数据的方式,他们都有未初始化 m_area
。
修复如下:
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指出使用自动生成的实现可以自己正确处理,所以如果没有压力的情况导致你自己实现这些,请删除它们。