2010-10-07 54 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. 
} 

建議:將其設置爲一個類。有了課程,您還可以添加「打印」和「輸入」方法。