如何在C ++中为枚举重载++运算符

时间:2017-07-23 06:16:09

标签: c++ enums operator-overloading pre-increment

这是我尝试过的,但是我发现只有在将变量分配给另一个变量时,重载才会增加变量。即,我做增量的变量的值不会增加。因此,在下面的示例中,变量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;
}

2 个答案:

答案 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;
}