2010-05-31 9 views
7

posibles duplicados:
Enumerate over an enum in C++
C++: Iterate through an enumC++ en foreach

He tener una clase de tarjeta para un juego de blackjack con las siguientes enumeraciones:

enum Rank { Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King }; 
enum Suit { Clubs, Diamonds, Hearts, Spades }; 

Cuando creo el mazo, quiero escribir c oda como esta:

// foreach Suit in Card::Suit 
// foreach Rank in Card::Rank 
//  add new card(rank, suit) to deck 

Creo que no hay foreach en C++. Sin embargo, ¿cómo atravieso una enumeración?

Gracias, Spencer

+0

Ver esta pregunta relacionada : http://stackoverflow.com/questions/1390703/enumerate-over-an-enum-in-c – Alan

+2

@ Alan que me parece un duplicado exacto –

Respuesta

19

Es común añadir elementos a la enum para facilitar esto:

enum Rank { 
    Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, 
    RankFirst = Ace, RankLast = King 
}; 
enum Suit { 
    Clubs, Diamonds, Hearts, Spades, 
    SuitFirst = Clubs, SuitLast = Spades 
}; 

entonces usted puede escribir sus bucles como:

for (int r = RankFirst; r <= RankLast; ++r) { 
    for (int s = SuitFirst; s <= SuitLast; ++s) { 
     deck.add(Card((Rank)r, (Suit)s)); 
    } 
} 
+0

Lo intenté y obtuve un error. Aquí lo que obtuve trabajando: para (int suit = Card :: Clubs; suit <= Card :: Spades; suit ++) \t \t for (int rank = Card :: Ace; rank <= Card :: King; rango ++) \t \t \t cards.push (Tarjeta (Tarjeta :: Ránter (rango), Tarjeta :: Traje (palo))); – Spencer

+0

Tienes razón, eso es lo que obtengo al responder preguntas tan antes de ir a la cama. He actualizado el código con algo que compila ahora. Si sigue los enlaces a los "duplicados", encontrará varias soluciones más exóticas que le permitirán aplicar ++ al Enum mismo. Proporcionan más seguridad de tipo (sin moldes). Sin embargo, la solución más simple provista aquí la he visto en toneladas de código C++ de producción. – MtnViewMark