C++ 重载增量运算符、循环和边情况

C++ 重载增量运算符、循环和边情况,c++,operator-overloading,for-loop,C++,Operator Overloading,For Loop,我有一个枚举,看起来像这样: enum Suit {Clubs, Diamonds, Hearts, Spades}; 我想重载递增运算符,这样我就可以轻松地循环这四个家伙 当变量为梅花、钻石或红心时,没有问题。正是黑桃的状况给了我一点麻烦 我的第一反应是定义它,当变量是黑桃时,递增将其设置为等于梅花。问题在于,这似乎使循环遍历枚举中的4个值变得不可能 如果我做了类似的事情 for(Suit i=Clubs;i<Spades;++i) {cout<<i<<

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

enum Suit {Clubs, Diamonds, Hearts, Spades};
我想重载递增运算符,这样我就可以轻松地循环这四个家伙

当变量为梅花、钻石或红心时,没有问题。正是黑桃的状况给了我一点麻烦

我的第一反应是定义它,当变量是黑桃时,递增将其设置为等于梅花。问题在于,这似乎使循环遍历枚举中的4个值变得不可能

如果我做了类似的事情

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

for(Suit i=Clubs;i您可以为开始和结束条件添加
enum
值,以及一个不循环回到开始的
++
替代值

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

for ( suit i = FirstSuit; i != AllSuits; i = iterate_suits( i ) )
<> > < <代码> > 和<>代码> 循环总是在执行之前检查条件,在没有任何附加变量或流控制的情况下,没有办法结束它们在循环范围内的执行。
Suit iter_suit = my_suit; // iterate over all suits beginning with my_suit.
do {
} while ( ++ iter_suit != my_suit );

在这种情况下,您不需要
FirstSuit
allsuit

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

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

for ( suit i = FirstSuit; i != AllSuits; i = iterate_suits( i ) )
<> > < <代码> > 和<>代码> 循环总是在执行之前检查条件,在没有任何附加变量或流控制的情况下,没有办法结束它们在循环范围内的执行。
Suit iter_suit = my_suit; // iterate over all suits beginning with my_suit.
do {
} while ( ++ iter_suit != my_suit );
在这种情况下,您可能不需要
FirstSuit
allsuit

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

for(Suit i=Clubs;i<NumberOfSuits;++i)
 {cout<<i<<endl;}
enum套装{梅花、钻石、红桃、黑桃、NumberOfSuits};
对于(西装i=球杆;i也许

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

for(Suit i=Clubs;i<NumberOfSuits;++i)
 {cout<<i<<endl;}
enum套装{梅花、钻石、红桃、黑桃、NumberOfSuits};

对于评论中建议的(Suit i=Clubs;i),将枚举定义为:

enum Suit {Clubs, Diamonds, Hearts, Spades, EndSuit};
然后您的循环变成:

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

for(Suit i=Clubs;i如评论中所建议的,将枚举定义为:

enum Suit {Clubs, Diamonds, Hearts, Spades, EndSuit};
然后您的循环变成:

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

for(Suit i=Clubs;i由于
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.
}

建议:将其放入一个类中。对于一个类,您还可以添加“打印”和“输入”方法。

由于
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.
}

建议:将其放入类中。在类中,您还可以添加“打印”和“输入”方法。

您自己刚刚发现了对的需求,尤其是零件。您自己刚刚发现了对的需求,尤其是零件。为什么
运算符+++
永远不应该返回所有西装?相反,当递增所有西装时,它不应该抛出吗?这个答案对我来说似乎最有意义。我认为定义运算符+我要说的是不同的do@Uncle:OP似乎是在描述一个模运算。没有理由认为这是无效的。它也永远不会返回AllSuites,并在递增该值时抛出。@Alexander:我在发布后想到,
运算符+
的重载需要添加
AllSuites
,以获得一个有效的return值。那么您可以只使用
AllSuits
(或者
NumberOfSuits
,或者其他任何东西)作为一个常量。我不明白的是,如果
I
总是有四个较小的值之一,“II有何不同?为什么
operator++
永远不返回allsuites?相反,当递增allsuites时它不应该抛出吗?这个答案对我来说似乎最有意义。我认为d我要做的是定义运算符+不同do@Uncle:OP似乎是在描述一个模运算。没有理由认为这是无效的。它也永远不会返回AllSuites,并在递增该值时抛出。@Alexander:在发布后我突然想到,
运算符+
的重载需要添加
AllSuites
因此,您不妨使用
AllSuits
(或
NumberOfSuits
,或其他任何形式)作为一个常量。我不明白的是,如果
I
总是有4个较小的值中的一个,那么'I有什么不同呢?我想我应该提到这一点,但我也有一个重载的。我想我应该提到这一点,但我也有一个重载的