2

比較演算子>とのオーバーロードに問題があり<ます。私は2つの異なる方法を試しましたが、まだ問題があります。

bool Car::operator ==(const Car &car)
{
    return mLNumber == car.GetNum();
}

bool Car::operator <(const Car &carB)
{
    return mLNumber < carB.GetNum(); 
}
bool Car::operator >(const Car &carB)
{
    return mLNumber > carB.GetNum(); 
}
int Car::GetNum()
{
    return mLNumber;
}

私の==オペレーターはうまく機能します。これらの演算子が存在しないというエラーが表示されます。これが私の2回目の試みです。

bool Car::operator <(const Car &carA, const Car &carB)
{
    return carA.GetNum() < carB.GetNum(); 
}
bool Car::operator >(const Car &carB)
{
    return carA.GetNum() > carB.GetNum(); 
}

そして、パラメータが多すぎるというエラーが表示されます。私もこれを取得します:

'Car::GetNum' : cannot convert 'this' pointer from 'const Car' to 'Car &' 
4

6 に答える 6

6

あなたの演算子を作ってみてくださいconst

bool Car::operator <(const Car &carB) const {
    return mLNumber < carB.GetNum(); 
}
bool Car::operator >(const Car &carB) const {
    return mLNumber > carB.GetNum(); 
}

編集:この場合、オブジェクトで呼び出しているため、GetNum()関数も作成する必要があります。constconst Car&

あなたはどちらも必要ありませんGetNum()、あなたはただ書くことができます

bool Car::operator <(const Car &carB) const {
    return mLNumber < carB.mLNumber; 
}
于 2012-10-25T20:18:02.087 に答える
3

コードには 2 つの問題があります。最初に、論理的には、演算子は型に対して不変constです。オブジェクトを変更せず、分析するだけであり、不変の ( ) オブジェクトでそれらを呼び出すことができるはずです。したがって、アレスタニスが指摘したように、それらconstを作成します(すべての演算子とゲッターメソッド)。

2 番目の 、< ==および>は二項演算子です。それらを実装するには、フリー オペレーターとして、またはメンバーとしての 2 つのオプションがあります。メンバーと一緒に行ったのは問題ありませんが、

bool Car::operator <(const Car &carA, const Car &carB)

二項演算子を宣言しません。オペレーターをメンバーとして実装する場合、最初のパラメーターは暗黙的に現在のオブジェクト ( *this) であるため、次のようにする必要があります。

bool Car::operator <(const Car &carB) const

free 演算子は次のようになります。

bool operator < (const Car& carA, const Car& carB);

constこれはメンバーではないため意味がないことに注意してください。ただし、最初のパラメーター ( carA) は const としてマークされていることに注意してください。これconstは、メンバー バージョンのメソッドに適用されるものに対応します (フードの下では、 としてマークthisされconstます)。

于 2012-10-25T20:24:37.650 に答える
1

これらの演算子をどこで呼び出しているかを確認すると役立ちます。

2 つの Car 引数を持つ 2 番目のバージョンは、グローバル オペレーターにする必要があります。Car:: を使用する場合は、定義から削除してください。Car クラスの本体からも宣言を移動します。

const Car オブジェクトで GetNum を呼び出しているため、Car::GetNum 関数も const である必要があります。これを行うためのより汚い方法は const-ness を捨てることですが、それは眉をひそめています。

于 2012-10-25T20:20:27.743 に答える
1

最初のケースでは:

演算子はオペランドのデータを変更しないため、const にする必要があります。

bool Car::operator <(const Car &carB) const {
                                    //^^^^^
    return mLNumber < carB.GetNum(); 
}
bool Car::operator >(const Car &carB) const {
                                   // ^^^^^
    return mLNumber > carB.GetNum(); 
}

int Car::GetNum() const
                //^^^^^
{
    return mLNumber;
}

2 番目のケースでは、演算子が 2 つの引数を受け入れる場合、それらはフリー関数として実装する必要があります。

bool operator <(const Car &carA, const Car &carB)
{
    return carA.GetNum() < carB.GetNum(); 
}
bool operator >(const Car &carA, const Car &carB)
{
    return carA.GetNum() > carB.GetNum(); 
}
于 2012-10-25T20:21:15.750 に答える
1

constあなたのエラーは、1 つのオブジェクトを比較したいときに演算子が としてマークされていないconst場合です。原則として、オブジェクトを変更しない関数と演算子を常にマークする必要がありますconst。これにより、作業がはるかに簡単になります。例えば:

bool Car::operator ==(const Car &car) const // <-- This function is const
{
    return mLNumber == car.GetNum();
}
于 2012-10-25T20:21:15.733 に答える
1

問題は、car::GetNum()が宣言されていないため、のインスタンスでconst呼び出すことができないことです。演算子は を引数として取るため、はオブジェクトですが、宣言されていないため、 on を呼び出すことはできません。constcarconst Car &carBGetNum()carBcarBconstGetNum()const

オブジェクトを変更しないすべての関数を として宣言する習慣を身に付ける必要がありますconst。関数を として宣言するには、閉じ括弧の後constに単純に追加します。const宣言と定義の両方で。例えば:

class car {
    // ...
    void car::foo() const;
    // ...
};

void car::foo() const
{ /* ... */ }

または、クラス宣言内でインラインで定義している場合:

class car {
    // ...
    void car::foo() const
    { /* ... */ }
    // ...
};

この特定のケースでは厳密には必要ではありませんが (これがコードがコンパイルされない理由ではないことを意味します)、同じ理由で演算子自体も宣言する必要があります(オブジェクトconstでも使用できるようにするため)。const

于 2012-10-25T20:21:26.307 に答える