2016-05-12 9 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私はこれを持っていることを試みました: "7 [Room&Room :: operator <(Room&)]のプロトタイプが 'Room'のクラスと一致しません" – Sini

答えて

4

クラスRoomには、メンバー番号がRoom operator<(Room& r1)のfunctonがあります。ただし、これはオーバーロードされたoperator<として使用されるシグネチャではありません。あなたの定義は

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

Room operator<(const Room& r1); 

そして、あなたの宣言に変更しても、(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;。あなたはconstのもint charge()多分Client::getTheDとして宣言する必要があります)。 const correctnessの詳細を見てください。

+3

'operator <'の戻り値の型を 'bool'にすることを勧めませんか? –

+0

@JohnZwinck良い点:) – Zereges

+0

実際には、私は(最後のもの)でしたが、私はmain()の関数に間違いがあり、コンパイラはそれをキャッチしてmakefileエラーで解決しました – Sini

関連する問題