web-dev-qa-db-ja.com

「無効なオペランドからバイナリ式」エラーを修正する方法

私はc ++を使用する経験がなく、コンパイラがバイナリ式の無効なオペランドを生成する点で行き詰まっています

class Animal{
public:
    int weight;
};

int main(){
    Animal x, y;
    x.weight = 33;
    y.weight = 3;

    if(x != y) {
    // do something
     }
}

メインコードのコードを変更せずに、xを使用してyと比較したい(つまり、(x.weight!= y.weight))。外部のクラスまたは定義からこの問題にどのように取り組むべきですか?

7
user2974866

あるいは、非メンバーとしてオペレーターオーバーロードを追加できます。

#include <iostream>
using namespace std;

class Animal{
public:
    int weight;
};

static bool operator!=(const Animal& a1, const Animal& a2) {
    return a1.weight != a2.weight;
}

int main(){
    Animal x, y;
    x.weight = 33;
    y.weight = 3;

    if(x != y) {
        cout << "Not equal weight" << endl;
    } 
    else {
        cout << "Equal weight" << endl;
    }
}
5
Sambuca

コメントで提案されているように、_!=_演算子をオーバーロードする必要があります。次に例を示します。

_class Animal{
public:
    int weight;

    bool operator!=(const Animal &other)
    {
        return weight != other.weight;
    }
};
_

式_x != y_は、この演算子への関数呼び出しに似ていますが、実際にはx.operator!=(y)と同じです。

6
TobiMcNamobi