2013-05-08 120 views
1

所以我想重载operator+。这是我到目前为止,但它仍然无法正常工作。我将如何写入语法? 头文件:如何超载运算符+

private: 
     int month; 
     int year; 
     int day; 

public: 
    upDate(); 
    upDate(int M, int D, int Y); 
    void setDate(int M, int D, int Y); 
    int getMonth(); 
    int getDay(); 
    int getYear(); 
    int getDateCount(); 
    string getMonthName(); 
    friend upDate operator+(const upDate &lhs, const upDate &rhs); 

我.cpp文件

upDate::upDate() 
{ 
    month = 12; 
    day = 12; 
    year = 1999; 
} 
upDate::upDate(int M, int D, int Y) 
{ 
    month = M; 
    day = D; 
    year = Y; 
}//end constructor 
void upDate::setDate(int M, int D, int Y) 
{ 
    month = M; 
    day = D; 
    year = Y; 
}//end setDate 
int upDate::getMonth() 
{ 
    return month; 
}//end get Month 
int upDate::getDay() 
{ 
    return day; 
}//end getDate 
int upDate::getYear() 
{ 
    return year; 
}//end getYear 

upDate operator+(const upDate &lhs, const upDate &rhs) 

{ 
upDate temp; 
temp.day = lhs.day + rhs.day; 
return (temp); 
} 

在我主我

upDate D1(10,10,2010);//CONSTRUCTOR 
upDate D2(D1);//copy constructor 
upDate D3 = D2 + 5;//add 5 days to D2 
upDate D4 = 5 + D2;// add 5 days to D2 

的错误是,我不能一个对象添加到一个int。我尝试过它的工作方式,但它只适用于D3 = D2 + 5而不是D4。任何帮助,将不胜感激。

+0

2月12日加5月30日是什么? – 2013-05-08 22:57:51

+0

4月1日@ @ KerrekSB – 2013-05-08 23:28:01

+0

@Kerrek:假设我们的约会系统在接下来的138亿年左右保持一致,大约在今年1月10日13797295634. – 2013-05-08 23:35:47

回答

4

需要两个功能:

upDate operator+(int days, const upDate &rhs) 
{ 
    ... add days to date ... 
} 

upDate operator+(const upDate &lhs, int days) 
{ 
    ... 
} 
+0

你在哪一个操作符上重载第二个? – 0x499602D2 2013-05-08 23:12:03

+0

解决'd2 + 5'的问题 - 或者编译器会发现'd2 + 5'和'5 + d2'是一样的 - 我不记得上次我尝试过了,但我想我可以误解了它。我承认我在客户运营方面做得并不多。 – 2013-05-08 23:15:21

+0

啊,对不起,现在我明白你的意思了 - 有一个+失踪......;) – 2013-05-08 23:17:47

0

您需要:

upDate operator+(const upDate &lhs, int days) 
{ 
    ... 
} 

upDate operator+(int days, const upDate &rhs) 
{ 
    .... 
} 

或者你可以有一个构造函数以单个int,让转换的工作你......但这有点奇怪,因为你增加了一个持续时间,而你的班级代表了一个日期。但是,您的实际运营商+无论如何都存在此问题 - 添加两个日期意味着什么?

编辑:看看在C++ 11时辰,它使时间点和持续时间之间的良好区分时间

0

为了尽量减少编码冗余,这里有一个如何通常会实施各种相关操作:

struct Date 
{ 
    Date & operator+=(int n) 
    { 
     // heavy lifting logic to "add n days" 
     return *this; 
    } 

    Date operator+(int n) const 
    { 
     Date d(*this); 
     d += n; 
     return d; 
    } 

    // ... 
}; 

Date operator(int n, Date const & rhs) 
{ 
    return rhs + n; 
}