0

演算子のオーバーロードに少し問題があります。私は2つのクラスを持っています。

#include <iostream>
using namespace std;

    class Meter; //Forward declaration        

    class Inch{
    private:
        double inches;

    public:
        Inch() : inches(0) {}
        Inch(double i) { inches=i; }
        friend Inch operator+ (const Meter& m, const Inch& i);
        void out(){ cout << "Inch:" << inches << "\n";  }
        double getInches() const { return inches; }
    };

class Meter{
private:
    double meter;    
public:
    Meter() : meter(0) {}
    Meter(double m) { meter=m; }
    Meter operator+ (const Inch& i) { return Meter(meter + i.getInches() * 0.0254); }    
    void out(){ cout << "Meter:" << meter;  }
    double getMeter() const { return meter; }
};

Inch operator+ (const Meter& m, const Inch& i)
{ return Inch(m.getMeter()/0.0254 + i.getInches()); }

主に、これらのクラスのそれぞれの 1 つがあります。それらを順序とともに追加する必要m + i;があります。つまり、m が最初のオブジェクトでなければなりません。そのために、フレンド関数を使用して、2 つのオブジェクトをパラメーターとして使用しました。

Inch i(6.4), resultInch; 
Meter m(14), resultMeter; 

i.out(); 
m.out();  

resultMeter = m + i; 
resultMeter.out(); 

resultInch = m + i; 
resultInch.out();

上記でresultMeter、正しい値を保持しますが、resultInchコンパイラーを配置すると、「bla bla bla に一致しないエラー」が表示されます。

私は何が欠けていますか?

4

4 に答える 4

7

問題は、これら 2 つの演算子の両方が+、コード内でまったく同じものに対するオーバーロードであることです。どちらか一方を使用できますが、同じプログラムで両方を使用することはできません。

Inch operator+ (const Meter& m, const Inch& i);
class Meter{
   Meter operator+ (const Inch& i);
};

1 つ持っていて、それらを で追加しようとするとMeter m;どうなるかを考えてみてください。どのオペレーター実装を呼び出す必要がありますか?Inch i;m + i

于 2013-02-25T19:22:46.473 に答える
3

C++ は戻り値をオーバーロードできません。だからあなたが言うことができるようにしたいとき:

meters = meters + inches;

inches = meters + inches;

どちらmeters + inchesも同じ機能です。units 属性と変換関数を使用して 1 つの長さクラスを作成することをお勧めします。しかし、それが欠けているので、2 つの長さクラスの間で変換演算子を記述することをお勧めします。meters + metersその場合、必要な加算関数は 1 つだけです (2 つの :と を記述する必要がありますinches + inches)。型は前後に変換できます。

于 2013-02-25T19:39:27.653 に答える
1

両方のクラスから operator+ を削除します。追加の結果として使用されるプロキシ クラスを作成します。

class ProxyMeterInch
{
  private:
    double op1, op2;
  public:
    friend ProxyMeterInch operator+(Meter m, Inch i)
    {
      ProxyMeterInch r;
      r.op1 = m.getMeter();
      r.op2 = i.getInch() * 0.0254; // I tend to keep it in meters as I am European
      return(r);
    }
    operator Meter() const
    {
      return(op1 + op2);
    }
    operator Inch() const
    {
      return((op1 + op2) / 0.0254);
    }
};

あなたはアイデアを得る。正しい変換演算子に割り当てようとしている型に応じて選択されます。

于 2013-02-25T20:11:50.483 に答える
0

わかりました、それで私はそれが

Inch resultInch = m + i; // not Meter resultInch (...)

これは以下と同等です:

Inch resultInch = (Meter)m.operator+(i);

Meterと の間で変換する方法がありませんInch

に変更してみてくださいInch resultInch = i + m;

于 2013-02-25T19:39:00.753 に答える