2016-05-12 4 views
3

Я попытался перегрузить operator < для сортировки номеров по цене.Не удалось найти ошибку в операторе перегрузки <

Вот соответствующая часть моего кода:

class Room{ 
    protected: 
     int roomNo; 
     int category; 
     Client client; 
    public: 
     Room(); 
     Room(int no, int cat, Client cl); 
     void printData(); 
     int charge(); 
     Room operator < (Room &r1); 
}; 

Room Room::operator < (Room &r1){ 
    if(this->charge() < r1.charge()){ 
     return r1; 
    } 
    else{ 
     return *this; 
    } 
} 

Но компилятор дает мне следующую ошибку, когда я пытаюсь использовать operator<:

main.cpp:(.text+0x2d8): undefined reference to `Room::operator<(Room const&)' 
main.cpp:(.text+0x2ff): undefined reference to `Room::operator<(Room const&)' 
[Error] ld returned 1 exit status 
Makefile.win recipe for target 'Ask01.exe' failed 

Почему не код скомпилировать?

+5

См. Http://stackoverflow.com/questions/4421706/operator-overloading?rq=1, ваша сигнатура функции неверна. Подсказка: ошибка говорит вам, что это должно быть – EdChum

+0

Не должно быть 'Room & Room :: operator <(const Room & r1)'? – trojanfoe

+0

Whet Я попробовал, чтобы у меня было это: «39 \t 7 [Ошибка] прототип для« Room & Room :: operator <(Room &) »не соответствует ни одному классу« Комната » – Sini

ответ

4

Ваш класс Room имеет член functon с подписью Room operator<(Room& r1). Однако это не подпись, которая будет использоваться как перегруженная operator<. Измените определение

Room operator<(const Room& r1); 

И вашей декларации

Room Room::operator<(const Room& r1) 
{ 
    /* code */ 
} 

Кроме того, считается лучшей практике перегружать операторы как друга функций, не являющихся членами (см this question).

Кроме того, я бы решил изменить возвращаемое значение operator< на const Room&, чтобы избежать ненужной копии.

В любом случае, почему возвращаемое значение operator< не равно bool? Это может смутить кого-то.

Room first, second; 
if (first < second) 
    doSomething(first); 
else 
    doSomething(second); 

может быть немного больше, чем просто (first < second).doSomething(), но ваша интуиция определенно яснее.

Кроме того, если вы настаиваете на определении operator< в качестве функции члена, я бы рекомендовал объявить его как const (как bool /*Room*/ operator<(const Room& r1) const;. Вы должны объявить как константы также int charge() и, возможно, даже Client::getTheD). Узнайте больше о const correctness.

+3

Разве мы не рекомендуем, чтобы возвращаемый тип 'operator <' be 'bool'? –

+0

@JohnZwinck good point :) – Zereges

+0

На самом деле это то, что я сделал (последний), но у меня была ошибка в функции в main(), и компилятор не поймал его, поэтому он разрешил ошибку makefile – Sini

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