Оператор перегрузки <не работает для указателя типа claas - PullRequest
0 голосов
/ 08 марта 2020

Как перегрузить оператор "<" для работы с указателями, указывающими на классы? </p>

Оператор <для классов c работает правильно, но для указателей он не возвращает правильный ответ и кажется, что нет работать на всех. </p>

class Point
{
    int x, y;

public:

    bool operator< (const Point* &p) const 
    { 
        if (x == p->x)
            return y < p->y;
        else
            return x < p->x;
    }
    bool operator< (const Point &p) const 
    { 
        if (x == p.x)
            return y < p.y;
        else
            return x < p.x;     
    }

    Point (int a, int b)
    {
        x = a;
        y = b;
    }
};

Здесь я проверяю функцию перегрузки. В обоих случаях моя программа должна вернуть false.

    Point* a = new Point(1,2);
    Point* b = new Point(0,0);

    Point c = Point(1,2);
    Point d = Point(0,0);

    cout<< boolalpha << (a<b) << '\n';  <- always returns true
    cout<< boolalpha << (c<d) << '\n';  <- returns false

1 Ответ

2 голосов
/ 08 марта 2020

Вы не можете перегружать операторы только для встроенных типов, таких как operator+(int, double) или operator<(int*, int*). Это просто невозможно. На самом деле, поведение (a<b) не определено, потому что вы сравниваете два не связанных между собой указателя (см. этот ответ для более подробной информации). Но вы можете:

  1. Разыменовать указатели перед сравнением.
  2. Создать именованную функцию, например comparePointPointers, и использовать ее как обычную функцию.
  3. Создайте умные указатели, оберните их вокруг ваших указателей, перегрузите операторы, чтобы сравнить их.
...