2010-10-07 60 views
0

我有一个枚举,看起来像这样:重载增量运算,循环和边缘情况

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

我想重载递增运算符,这样我就可以很容易地遍历这四个帅哥。

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

我的第一本能是定义它,以便当变量为黑桃时,增量将其设置为等于Clubs。问题是,这似乎无法循环枚举中的4个值。

如果我这样做

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

然后我只输出去心。

,如果我做

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

那么我的输出只是循环永远!

所以,我明显地想到了一些解决方法...我只是不确定惯用的C++的东西是做什么的。

我是否应该重新定义增量,以便尝试增加一个Spade导致一个Spade?或者可能引发异常?

重申:我完全可以想到一些解决此问题的方法。我只想让有经验的程序员指导他们,他们认为这是解决问题最“正常”的方式。

+1

您刚刚发现,您自己需要[iterators](http://www.cplusplus.com/reference/std/iterator/),尤其是[end](http://www.cplusplus .com/reference/stl/vector/end /)部分。 – 2010-10-07 16:46:18

回答

2

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

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

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

由于forwhile环总是在执行前检查的条件下,也没有办法来结束他们的在循环范围的中间执行而无需额外的变量或流量控制。 A do while循环在这种情况下效果最好。

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

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

+0

为什么'operator ++'永远不会返回AllSuits?相反,增加AllSuits时不应该抛出? – UncleBens 2010-10-07 16:50:15

+0

这个答案似乎对我最有意义。我认为不同的定义operator +是我要做的 – 2010-10-07 17:04:31

+0

@Uncle:OP似乎在描述一个模操作。没有理由应该是无效的。它也永远不会返回AllSuits,*和*在增加该值时抛出。 – Potatoswatter 2010-10-07 17:08:37

0

也许

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

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

有一些仍然unidiomatic(我知道俱乐部是第一个套装)。

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

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

嗯,我想我应该提到这一点,但我也有一个重载的<<运算符的诉讼枚举。我知道这对于那么简单的事情来说非常复杂,但我真的是在为自己做一个OO练习。所以,隐式的int转换不会使用我的<<运算符。另外,我考虑给我的枚举添加一个成员,但我认为这是不雅的。当然,如果事实证明我需要,我可以做到。另外,对编辑抱歉,我没有想到“输入”提交我的文章。我在这里是新手; D – 2010-10-07 16:50:43

1

作为一个评论所说,那只是定义你的枚举为:

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

然后你的循环变成:

for(Suit i=Clubs;i<EndSuit;++i) 
{ 
    cout<<i<<endl; 
} 
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. 
} 

建议:将其设置为一个类。有了课程,您还可以添加“打印”和“输入”方法。