3

クラス Date の + 演算子と += 演算子をそれぞれオーバーロードする次のコードがあります。演算子 + は正常にオーバーロードされ、整数 n を取り、Date オブジェクトを n 日増やします。これは、next_day 関数を n 回適用することによって行われます。

inline Date operator+(Date d, int n)
{
    for(char j=1; j<=n; j++){
        d=d.next_day(d);
    }
    return d;
}
inline Date operator+=(Date d, int n)
{
    Date p=d+n;
    return p;
}

+ 演算子をオーバーロードしたので、それを使用して += のオーバーロードも定義しています。しかし、コンパイルでエラーは発生しませんでしたが、オーバーロードされた += を使用すると、何の効果もないようです。

これが私のmain.cppです:

#include <iostream>
#include "Date.h"
using namespace std;

int main() {

Date Initialday = Date (12,1,2012);

Initialday+=1;
cout <<"Next day = "<< Initialday <<endl;

return 0;
}

メイン関数を実行すると、2012 年 12 月 2 日ではなく 2012 年 12 月 1 日になります。私は何を間違っていますか?注: 私はすでに << をオーバーロードして Date オブジェクトを読み取り可能な形式で出力しているので、それは問題ではないと思います。

4

2 に答える 2

5

簡単な修正は、Dateオブジェクトを参照によって取り込み、変更して、参照によって返すことです。これがの予想される動作ですoperator+=

inline Date& operator+=(Date &d, int n)
{
    d = d + n;
    return d;
}

operator+=ただし、の観点から実装するのoperator+は逆です。逆のはずです。 operator+=オブジェクトのメンバーに作用し、それらを直接変更する必要があります。次にoperator+、その観点から実装する必要があります。

inline Date& operator+=(Date& lhs, int rhs)
{
    ... // code here to modify lhs directly

    return lhs;
}

inline Date operator+(Date lhs, int rhs)
{
    return lhs += rhs;
}
于 2013-02-17T07:24:20.957 に答える
2

主な問題は+=、新しいDateオブジェクトを作成して返すことです。これは間違ったセマンティクスです。さらに、その戻り値を何にも割り当てません。+=オペレーターは、適用されるインスタンスを操作し、参照によって返す必要があります。

inline Date& operator+=(Date& d, int n) {
   return d = d + n;
}

通常、これはメンバー関数として+実装され、次の観点から実装されます+=

class Date
{
 public:
    Date& operator+=(int n) {
       // perform whatever operation is required using
       // the state of the instance.
       return *this;
    }
};

inline Date operator+(Date lhs, int rhs) {
  return lhs += rhs; // calls member +=
}

最もクリーンな方法は、期間クラスを提供し、aDateTimeDuration:の観点からすべての演算子を実装することです。

struct TimeDuration { .... };

class Date
{
 public:
  Date& operator+= (const TimeDuration& rhs) { .... }
};
inline Date operator+(Date lhs, const TimeDuration& rhs) { return lhs += rhs; }
于 2013-02-17T07:24:54.027 に答える