重载增量运算符,循环和边缘情况

时间:2010-10-07 16:42:08

标签: c++ operator-overloading for-loop

我有一个枚举,看起来像这样:

enum Suit {Clubs, Diamonds, Hearts, Spades};

我想重载增量运算符,所以我可以很容易地遍历这四个人。

当变量是Clubs,Diamonds或Hearts时,没有问题。它的黑桃条件让我有点麻烦。

我的第一直觉是定义它,以便当变量为黑桃时,增量设置等于俱乐部。问题是这似乎使得无法循环枚举中的4个值。

如果我做的话

for(Suit i=Clubs;i<Spades;++i)
     {cout<<i<<endl;}

然后我的输出只会转到Hearts。

如果我这样做

for(suit i=Clubs;i<=Spades;++i)
    {cout<<i<<endl;}

然后我的输出就会永远循环!

所以,我显然可以想到一些解决方法......我只是不确定C ++的惯用做法。

我应该重新定义增量,以便尝试增加一个Spade会导致一个Spade吗?或者可能抛出异常?

重申:我绝对可以想到一些解决这个问题的方法。我只是希望有经验的程序员能够指导他们认为解决问题的最“正常”方式。

4 个答案:

答案 0 :(得分:2)

您可以为开始和终止条件添加enum值,并为++添加一个不会循环回到开头的替代值。

enum Suit { FirstSuit, Clubs = FirstSuit, Diamonds, Hearts, Spades, AllSuits };

for ( suit i = FirstSuit; i != AllSuits; i = iterate_suits( i ) )

由于forwhile循环始终在执行前检查条件,因此无法在没有其他变量或流控制的情况下在循环范围的中间结束执行。在这种情况下,do while循环效果最佳。

Suit iter_suit = my_suit; // iterate over all suits beginning with my_suit.
do {
} while ( ++ iter_suit != my_suit );

在这种情况下,您不需要FirstSuitAllSuits

答案 1 :(得分:1)

正如评论中所建议的那样,将枚举定义为:

enum Suit {Clubs, Diamonds, Hearts, Spades, EndSuit};

然后你的循环变为:

for(Suit i=Clubs;i<EndSuit;++i)
{
    cout<<i<<endl;
}

答案 2 :(得分:0)

也许

enum Suit {Clubs, Diamonds, Hearts, Spades, NumberOfSuits};

for(Suit i=Clubs;i<NumberOfSuits;++i)
 {cout<<i<<endl;}

还有一些单调的东西(我必须知道俱乐部是第一套西装)。

为什么不直接使用隐式转换为int?

for (int i = 0; i < NumberOfSuits; ++i)

答案 3 :(得分:0)

由于enum值会衰减为(无符号)整数,您可以使用 moduluo 算术然后转换回enum

enum Suite add(const enum Suite card1, const enum Suite card 2)
{
 unsigned int result = card1;
 result += card2;
 result = result % 4;
 return (enum Suite) result;  // Casting shown for readability.
}

建议:把它变成一个类。使用课程,您还可以添加“打印”和“输入”方法。