2016-03-06 3 views
2

У меня есть QList<MyPoint*> l где MyPoint тип пользовательского класса-defiend, где я хотел бы сделать:Как написать собственный компаратор для QList указателей?

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) будет верно но я бы хотел, чтобы это повлияло на поведение , чтобы сравнить его с моим собственным компаратором.

ответ

2

Оператор == перегрузки будут работать только с адресами указателей объектов MyPointer, а не с самими объектами.

Вместо того чтобы иметь список объектов MyPointer *, попробуйте сделать список объектов MyPointer (т. Е. QList<MyPointer>). Вы должны будете убедиться, что вы перегрузите оператор присваивания и конструктор копирования.

Если это становится слишком дорогостоящим, рассмотрите возможность преобразования вашего класса в режим использования implicit sharing, как и большинство классов данных Qt, используя классы QSharedData и QSharedDataPointer.

Смежные вопросы