2011-11-04 5 views
13

例:C++ヘッダーファイルで、struct Recordを定義していて、可能なソートのために使用したいので、less operatorをオーバーロードしたいと考えています。ここに私が様々なコードで気づいた3つの方法があります。私はおおよそ気付きました。std::setmappriority_queue、...コンテナにRecordを入れるつもりならば、バージョン2が動作します(おそらくバージョン3も同様です)。 をvector<Record> vに保存してからmake_heap(v.begin(), v.end())などと呼び出すと、バージョン1のみが動作します。例えば、同じヘッダファイル内C++の演算子オーバーロードが少ない、どちらの使い方ですか?

struct Record 
    { 
     char c; 
     int num; 

     //version 1 
     bool operator <(const Record& rhs) 
     { 
     return this->num>rhs.num; 
     } 

     //version 2 
     friend bool operator <(const Record& lhs, const Record& rhs) //friend claim has to be here 
     { 
     return lhs->num>rhs->num; 
     } 
    }; 

 //version 3 
     inline bool operator <(const Record& lhs, const Record& rhs) 
     { 
     return lhs->num>rhs->num; 
     } 

基本的に、私は誰かがこれらの三つの方法の違い何いくつかの概要を思い付くことができるかどうかを確認するためにここに質問を投げたいと各バージョンの適切な場所は何ですか?

+3

はあなたの受け入れの評価を向上させます。 –

+0

動作しないケースごとに完全なサンプルプログラムを投稿してください。 –

+2

私はバージョン3を見ません –

答えて

5

これらは本質的に同じですが、最初のもの以外はconstではなく、自分自身を変更することができます。

は、私は2つの理由のために第二を好む:

  1. それはfriendである必要はありません。
  2. lhsRecord
+0

私は2番目のバージョンは、あなたが<クラス定義の中で演算子を要求する場合、それはクラスの友人としてそれを要求する必要があると考えます – user268451

+0

@ user268451それは友人である必要はありません。カプセル化がより良好になるので、実際には* 1でない方が良いです。 – Pubby

+0

@ Pubby8クラスの中から自由な関数を定義したい場合は、 'friend'を追加する必要があります。これはプライベートメンバーへのアクセスとは関係ありません。 – Sjoerd

-4

第1引数が間違った型であるため、クラス内でないことができない限り、インクラスを優先します。

+2

実際には、クラス外を優先する必要があるので、左右の両方の型の変換が適用されます(正しいものだけでなく)。可能であれば、非友人にして、それより優れたものにしてください。これは、演算子をpublicインターフェイスの観点から実装するクラスから切り離すためです。 –

+2

あなたが何らかの数字でない限り、比較演算子での変換は不要です! – Joshua

+1

@Joshuaこれは必ずしも真実ではありません。コンテナ(マップ、ソートセットなど)が必要な場合は、「非数」クラスに対して実装する必要があります。 – Kashyap

5

である必要はありません少ない演算子を定義するための最良の方法は次のとおりです。

struct Record{ 
    (...) 
    const bool operator < (const Record &r) const{ 
     return (num < r.num); 
    } 
}; 
+2

これは左側のコンバージョンを許可していないので、最善の方法ではありません。 – Sjoerd

+2

ipmlicit変換のパスは危険です。 – g24l

関連する問題