这是我尝试过的,但是我发现只有在将变量分配给另一个变量时,重载才会增加变量。即,我做增量的变量的值不会增加。因此,在下面的示例中,变量newDay
为THU,但currentDay
仍为WED。
如何定义重载运算符以增加变量我正在进行操作?
typedef enum days {MON, TUE, WED, THU, FRI, SAT, SUN} days;
inline days operator++ (days& d) {
return static_cast<days>((static_cast<int>(d) + 1) % 7);
}
int main(int argc, const char * argv[]) {
days currentDay = WED;
days newDay = ++currentDay;
cout << "Current day: " << currentDay << ", Stored day: " << calendar[0] << ", New day: " << newDay << endl;
}
答案 0 :(得分:1)
如果我将重载运算符修改为:
inline days operator++ (days const& d) {
return static_cast<days>((static_cast<int>(d) + 1) % 7);
}
尽管我在那里添加了const
说明符,但它仍然可以编译。那是因为你没有修改d
,就像前缀++
需求的语义一样。
因此,如果您希望操作员获得所需的效果,请确保修改它:
inline days operator++ (days& d) {
d = static_cast<days>((static_cast<int>(d) + 1) % 7);
return d;
}
如果没有评论自己设计的有效性,请注意,广泛持有的观点是前缀opearator++
应该返回一个可修改的左值,就像内置函数一样。请记住,如果您发现自己编写的代码如++x = y
,则需要返回引用,即date& operator++(date&)
。
答案 1 :(得分:-1)
您定义了后缀运算符。后缀运算符的正常行为是增加其参数的值,但返回原始值。它的行为应该是这样的:
days operator++(days& d,int){
days temp=d;
d=static_cast<days>((static_cast<int>(d) + 1) % 7);
return temp;
}
你想要的是前缀运算符。这会增加参数的值并返回对其参数的引用。它应该是这样的:
days& operator++(days& d){
d=static_cast<days>((static_cast<int>(d) + 1) % 7);
return d;
}