Что случилось с «const Obj» и «Obj &»? - PullRequest
2 голосов
/ 26 мая 2011

Я хочу написать класс, совместимый с std :: set, поэтому я перегружаю оператор "меньше чем" следующим образом.Это работает.

bool Segment::SVertex::operator<(const SVertex &rhs) const
{
    return id < rhs.id;
}

Однако, поскольку я пишу на Java больше, чем на C ++, 'rhs.id' выглядит для меня очень неудобно.Поэтому я изменяю его на 'rhs.getId ()', где getId () - это просто обычная функция получения:

long SVertex::getId(){return id;}

Это оказывается ошибкой времени компиляции: невозможно преобразовать указатель "this"от "const Segment :: SVertex" до "Segment :: SVertex &"

(обратите внимание, что мой VS2008 не английский, и я перевел сообщение об ошибке, поэтому строка выше не обязательно точна)

Я только знаю, что «&» обозначает передачу по ссылке, а «const» запрещает любые изменения.Я не совсем понимаю, что происходит за сценой.

Ответы [ 3 ]

7 голосов
/ 26 мая 2011

проблема в том, что ваша функция получения не совсем "нормальная"; ваш получатель должен быть

long SVertex::getId() const
{return id;}

Обратите внимание на const в конце: он сообщает компилятору / пользователям, что этот метод не изменяет внутренние компоненты класса. Таким образом, можно использовать его в вашем операторе, который также является постоянным. Функции-члены Const могут вызывать другие функции-члены, только если они также являются const; Неконстантные функции-члены могут вызывать любые.

5 голосов
/ 26 мая 2011

Ваш геттер должен быть постоянным:

long SVertex::getId() const {return id;}

Это сигнализирует, что это не меняет объект.

2 голосов
/ 26 мая 2011

Ваш rhs равен const, поэтому вы не можете его изменить.С другой стороны, ваш getId не обещает не менять this - он также должен быть постоянным:

int SVertex::getId() const { return id; }
...