2017-08-09 12 views
0

は、私は、クラスと呼ばれる本を持っていると言います"i"はbook1 == book2に遭遇した時です。オブジェクトのメンバーのための比較演算子のオーバーロード

bool is_same() { 
    return (book1==book2) ? true : false; 
} 

どうすればよいですか?これは私が持っている現在の演算子のオーバーロード関数です。これは、「 'bool'型のrvalueから型 'Book &'の非const参照の無効な初期化」を行います。私は現在、クラスブックの中で私のオーバーロードされた関数を公開関数として持っています。

Book& operator==(const Book& b) const { 
     return ISBN() == b.ISBN(); 
    } 

私はオペレータオーバーロードには比較的新しいので、私は多くの回答を味わっていますが、どれも問題を解決しません。私はbook1 == book2をどうすればいいのか理解していますが、すべてのメンバーが同じ値であればtrueを返します。この場合、私はただ1つ以上のものを持っていますが、 "i"が両方のオブジェクトで同じであればtrueを返します。

+2

知りたいことすべて:https://stackoverflow.com/questions/4421706/what-are-the-basic-rules-and-idioms-for-operator-overloading – NathanOliver

+2

Btwこの返品(book1 == book2)? true:false; '単純に' return book1 == book2; ' – DimChtz

答えて

1

あなたは基本的には2つの選択肢があります。

  1. 一つの引数を持つメンバ演算子を使用します。2つの引数を持つ非メンバ演算子(そしておそらくfriend文を)使用

    class Book { 
    ... 
        bool operator==(const Book &an) const { return ISDN() == an.ISDN(); } 
    }; 
    
  2. を:

    bool operator==(const Book &b1, const Book &b2) 
    { 
        return b1.ISBN() == b2.ISBN(); 
    } 
    

ISDN()constにする必要があることに注意してください。

いずれかの方法で、あなたは通常、代入演算子=、いない比較演算子==によって返されbool、ないBook &、返却する必要があります。

+0

これはまさに私が探していたものです –

+0

ちょっとした問題のためにまったく新しい質問を作成したくないのですが、 book1私はパラメータとして関数を呼び出す現在のオブジェクトを使用する可能性がありますか?だから、もし私がcompare()という関数を持っていて、book1.compare(book2)と呼んだら、私は2つのオブジェクトを渡すのではなくbook1とbook2を自動的に比較します。 –

+0

これは、どのようなメソッド(case1)を 'book1 == book2'またはより明示的な' book1.operator ==(book2) ' – Slava

関連する問題