2016-08-10 3 views
1

私は単純に、このような構造を宣言している -C++で2つの構造を比較できますか?

struct data{ 
    int x,y; 
}; 

今私はdataタイプの2つの変数a & bを宣言しました。私はそれらに適切な値を割り当てました。さて、私は彼らが等しいかどうかチェックしたい!私はこのようにやろうとしています -

data a,b; 
a.x=12, a.y=24; 
b.x=15, b.y=30; 
if(a!=b)cout<<"a~b"<<endl; 

しかし、コンパイラは私に4thラインに次のエラーを与えている - >

error: no match for 'operator!=' (operand types are 'data' and 'data')

を問題が実際にどこに?これはC++でサポートされているのですか?または私は間違いを犯しているのですか?

これを行う正確かつ簡単な方法は何ですか?構造体の各要素を別々に比較する必要がありますか?それとももっとスマートな方法がありますか?

+7

言語を選択してください。 C **または** C++。 – juanchopanza

+4

'bool operator!=(const data&、const data&);'を実装する必要があります。 – Jarod42

+2

C++で構造体を比較しているときに[No ==演算子が見つかりました]重複している可能性があります。(http://stackoverflow.com/questions/5740310/no-operator-found-while-comparing-structs-in-c) – bereal

答えて

2

C++は、暗黙のうちにあなたの属性ごとの属性の割り当てを与えず、平等や発注のための比較。理由は、「ただの理由」であり、哲学にはあまりにも難しくありません。

あなたは、必要に応じて、たとえば、明示的に自分自身の演算子を実装することにより、これらの演算子を提供する必要がありますように

bool operator<(const Data& other) const { 
    if (x < other.x) return true; 
    if (x > other.x) return false; 
    return y < other.y; 
} 

bool operator==(const Data& other) const { 
    return x == other.x && y == other.y; 
} 

とを。

たとえば、==を定義しても!=が自動的に指定されず、<を定義すると暗黙的に>=が指定されないことにも注意してください。

+0

'return std :: tie(lhs.x、lhs.y) Jarod42

+0

ありがとう!出来た! :) – jbsu32

0

bool operator != (const data&, const data&);を実装する必要があります。

(C++ 11で)可能な実装:

#include <tuple> 

//... 

bool operator == (const data& lhs, const data& rhs) { 
    return std::tie(lhs.x, lhs.y) == std::tie(rhs.x, rhs.y); 
} 

bool operator != (const data& lhs, const data& rhs) { 
    return !(lhs == rhs); 
} 
+0

なぜ一時的なオブジェクトを作成する必要がありますか? – Inline

+0

どのような一時的なオブジェクトですか? – paulm

+0

@inline:私はどの一時的なオブジェクトを作成すると思いますか? – Jarod42

4

すべての演算子を明示的に実装する必要があります。あなたの場合、bool operator!=(const data&, const data&)を提供する必要があります。

#include <tuple> 

// ... 

bool operator!=(const data& p_lhs, const data& p_rhs) 
{ 
    return std::tie(p_lhs.x, p_lhs.y) != std::tie(p_rhs.x, p_rhs.y); 
} 

std::tiedocumentation)は参照の一時的なタプルを作成します。

このようなPODのためにそれを実装するための良い方法は、それがすでに発注を実装しているのでstd::tupleを使用することです。 std::tupleはすべての比較演算子を定義するので、これらの2つのタプルを比較することができます。shown here.

フリー関数としてoperator!=を実装することを選択しました。もちろん、クラスのメンバーとして実装することもできます:

struct data 
{ 
    bool operator!=(const data& p_rhs) const 
    { 
     return std::tie(x, y) != std::tie(p_rhs.x, p_rhs.y); 
    } 

    int x, y; 
}; 

他の演算子もすべて定義する必要があります。ほとんどの演算子は他の演算子に委譲することで実装できます。

+0

私はネクタイについて知りませんでした!あなたの答えは私にそれを学ぶのを助けました。しかし悲しいことに、私のcodeblocks ideはそれをサポートしていませんでした:(私は正常にwww.ideone.comで実行しました:) – jbsu32

関連する問題