2016-09-06 2 views
-1

Я создал класс Point и перегрузил его operator== и класс PointSet, который имеет массив указателей на Point объектов.Сравнение между объектами повышать ошибку компиляции в соответствии с заказом

Теперь, когда я хочу сравнить между двумя объектами, я запускаюсь в необъяснимую ошибку компиляции, когда я пытаюсь сравнить A == B, но не тогда, когда B == A. i.e, когда im переворачивает порядок объекта, функция работает как разумеется. Я не нашел никакой логики между этими двумя случаями.

Это классы Точечные и множества точек (diffrenet заголовочные файлы)

class Point{ 
public: 
    Point(int x, int y); 
    ~Point(); 
    bool operator==(const Point& point); 

private: 
    int _x, _y; 
}; 

class PointSet 
{ 
public : 
    PointSet(const size_t startLen); 
    ~PointSet(); 
    int contains(const Point *point) const 

private: 
    Point **_pointArray; 
    size_t _size; 
}; 

это реализация operator==

bool Point::operator ==(const Point& point){ 
    return (this->_x == point.get_x() && this->_y == point.get_y()); 
} 

И это функция, где возникает проблема

int PointSet::contains(const Point *point) const{ 
    for (int i=0; i<_size;i++){ 
     if (*point == *_pointArray[i]){ <-----HERE 
      return i; 
     } 
    } 
    return -1; 
} 

это НЕ ОШИБКА if(*_pointArray[i] == *point)

ошибка

компиляция «Невозможно сравнить структуры»

+0

Что такое ошибка компиляции? –

+1

Ваш оператор == должен быть функцией const. –

+0

'get_x()' и 'get_y()' объявлены как 'const' функции? –

ответ

1

Ваш оператор == должен быть константной

+0

@limitless, тогда измените его и сделайте его const – Slava

+0

Хорошо, его решила проблема, но зачем помогать функции? – limitless

+0

@limitless, потому что аргумент функции contains является const. Поскольку функция operator == не была const, не было никакой подходящей функции operator ==. –

0

Try реализовать

bool operator==(const Point& lhs, const PointSet& rhs){ /* do actual comparison */ }

как функции члена друга. Также включают:

bool operator==(const PointSet& lhs, const Point& rhs){ /* do actual comparison */ }.

Так вы гарантируете, что это сработает.

Подробнее об этом можно узнать here.

+0

_ «Так вы гарантируете, что он будет работать» _ Нет. –

+0

@ πάνταῥεῖ Почему бы и нет? Это не перестановочный оператор, и один включает оба направления, а затем он работает. –

+0

По крайней мере, не с функциями const const 'get_x()' и 'get_y()'. –

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