2013-02-17 151 views
1

我有以下代码分别为类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月1日,而不是2012年12月2日。我究竟做错了什么?注意:我已经超载了< <以可读格式输出Date对象,所以我不认为这是问题所在。

回答

3

简单的修复方法是通过引用来获取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; 
} 
+0

非常感谢!我同意,它有些倒退 - 但在这种情况下,+ =和+似乎同样简单,因为我已经定义了next_day函数,并且认为我可以使用它。我想作为一个初学者,我首先定义+看起来更直观! – 2013-02-17 07:45:35

+0

只是为了学习,请问为什么以下不行? 'inline Date&operator + =(Date&d,int n) { Date p = d + n; return p; }' 它给了我一个错误消息,说本地变量p被自动返回。这是什么意思? – 2013-02-17 07:45:58

+0

@PatrickJane:这个问题并不是真的那么简单,比另一个更直接。这个问题主要是表现。 'operator +'接受两个对象,并从它们中创建一个完全独立的对象。但是没有理由'operator + ='应该需要构造一个新的对象。通过以'operator +'的形式实现'operator + =',您可以复制对象,修改副本,然后将副本复制回原始对象。这是两个不必要的副本,当它需要做的只是修改原始对象。 – 2013-02-17 07:53:23

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 += 
} 

最简洁的方法是提供一个持续时间等级,并按照DateTimeDuration执行所有运营商:

struct TimeDuration { .... }; 

class Date 
{ 
public: 
    Date& operator+= (const TimeDuration& rhs) { .... } 
}; 
inline Date operator+(Date lhs, const TimeDuration& rhs) { return lhs += rhs; } 
+0

究竟是什么意思将两个日期相互添加? – 2013-02-17 07:38:24

+0

@BenjaminLindley这意味着我还没有喝咖啡。需要的是时差类型,但我想我会删除这个无用的答案。 – juanchopanza 2013-02-17 07:42:43

+0

@BenjaminLindley该死的,它已被接受,所以我现在必须修复它... – juanchopanza 2013-02-17 07:43:36