如何为指针QList编写自定义比较器?

时间:2016-03-06 16:59:01

标签: c++ qt operator-overloading

我有QList<MyPoint*> l其中MyPoint是用户违规类类型,我想这样做:

 QList<MyPoint*> l;
 MyPoint *a = new MyPoint(2, 4);
 MyPoint *b = new MyPoint(4, 8);
 MyPoint *c = new MyPoint(2, 4);
 l << a << b;

然后:

l.contains(c); //true

我尝试了==运算符,doc说:

  

此函数需要值类型具有实现   运算符==()。

尝试了不同的方式,但似乎都没有按预期工作。

这是我到目前为止尝试过的代码:

class MyPoint
{
public:
    int x, y;

    MyPoint(int x, int y)
        : x(x),
          y(y)
    {
    }

    bool operator == (const MyPoint &other) const
    {
        return other.x == this->x && other.y == this->y;
    }

    bool operator == (const MyPoint *other) const
    {
        return true;
    }
};

bool operator == (const MyPoint &a, const MyPoint &b)
{
    return a.x == b.x && a.y == b.y;
}

我尝试过类似的事情:

bool operator == (const MyPoint *a, const MyPoint *b)
{
    return a.x == b.x && a.y == b.y;
}

但我读到这是不可能的......我知道(*a == *c)将是真的,但我希望它影响contains()行为,以便使用我自己的比较器进行比较。

1 个答案:

答案 0 :(得分:2)

operator ==重载仅适用于MyPointer个对象的指针地址,而不是对象本身。

不要使用MyPointer *对象列表,而是尝试制作MyPointer对象列表(即QList<MyPointer>)。您必须确保重载赋值运算符和复制构造函数。

如果这样做太昂贵,请考虑通过使用QSharedDataQSharedDataPointer类来转换您的类,以便像大多数Qt数据类一样使用implicit sharing