Deklarace výčtu C++
Výčet je uživatelem definovaný typ skládající se ze sady pojmenované konstanty výčtu nazývá.
Informace o modulu CLR výčty, výčet tříd.
enum [tag] [: type] {enum-list} [declarator]; // for definition of enumerated type
enum tag declarator; // for declaration of variable of type tag
Parametry
tag
Zadejte název výčtu.type
Základní typ výčtu identifikátorů.Viz poznámky.enum-list
Seznam výčtu obsažené ve výčtu.declarator
Declarator seznam, který určuje názvy výčtu.Další informace naleznete v tématu Přehled Declarators.
Poznámky
Výčet poskytuje kontext k označení rozsahu hodnot.Následující příklad ukazuje výčtu, který obsahuje čtyři barvy v balíčku karet.
enum Suit { Diamonds, Hearts, Clubs, Spades };
Každý název výčtu, stane se čítač výčtu a je přiřazena hodnota, která odpovídá jeho místo z hodnot ve výčtu.Standardně je první hodnota přiřazena 0, další přiřazené 1 atd.Můžete nastavit hodnotu čítač výčtu.
enum Suit { Diamonds = 1,
Hearts,
Clubs,
Spades };
Čítač Diamonds je přiřazena hodnota 1.To ovlivní hodnoty, které jsou přiřazeny následující čítače výčtů; Heartsje přiřazena hodnota 2, Clubs 3 a tak dále.
C enum klíčové slovo je pro výčet deklarovat.V jazyce C++ enum klíčové slovo lze vynechat.Příklad:
Suit current; // Legal in C++ only
Výčet na základě proměnné lze přiřadit určité hodnoty.
Suit currentSuit = Hearts;
Pokud se pokusíte přiřadit hand hodnotu, která není den v týdnu
int myAccountNumber = 012345678;
Suit hand;
hand = myAccountNumber;
Kompilátor označí přiřazení jako chybu v době kompilace.I když technicky obě proměnné jsou čísla celé číslo, je osazení požadované pro převod int do výčtu.Můžete však přejít jiným způsobem a podporovat čítač výčtu bez osazení celočíselnou hodnotu.
myAccountNumber = hearts;
typeZákladní typ je identifikátory.Může to být libovolný typ skalární, například podepsaná nebo nepodepsaná verze int, short, nebo long.boolnebo char také povoleny.
Výčtové typy jsou cenné, když objekt může převzít známé a rozumně omezenou sadu hodnot.Zvažte například obleky z balíčku karet:
// enumeration_declarations.cpp
// compile with: /c
class Card {
public:
enum Suit {
Diamonds,
Hearts,
Clubs,
Spades
};
// Declare two constructors: a default constructor,
// and a constructor that sets the cardinal and
// suit value of the new card.
Card();
Card( int CardInit, Suit SuitInit );
// Get and Set functions.
int GetCardinal(); // Get cardinal value of card.
int SetCardinal(); // Set cardinal value of card.
Suit GetSuit(); // Get suit of card.
void SetSuit(Suit new_suit); // Set suit of card.
char *NameOf(); // Get string representation of card.
private:
Suit suit;
int cardinalValue;
};
// Define a postfix increment operator for Suit.
inline Card::Suit operator++( Card::Suit &rs, int ) {
Card::Suit oldSuit = rs;
rs = (Card::Suit)(rs + 1);
return oldSuit;
}
Předchozí příklad definuje třídu, Card, který obsahuje vnořené Výčtový typ Suit.
Protože typu Suit je vnořená název třídy (Card) se musí použít explicitně veřejné odkazy.Název třídy lze vynechat v metody.
Operátor Příponové přírůstek pro Card::Suit je definován, protože bez přírůstek uživatelem definovaný operátor, curSuit nemůže být zvýšen.Další informace o operátory definované uživatelem, viz Operátor přetížení.
Následující kód vytvoří sadu karet.
Card *Deck[52];
int j = 0;
for( Card::Suit curSuit = Card::Diamonds ; curSuit <= Card::Spades ; curSuit++ )
for( int i = 1; i <= 13; ++i )
Deck[j++] = new Card( i, curSuit );
Zvažte následující příkladu NameOf metoda.
#define SIZE_OF_CARD_NAMES 20
char* Card::NameOf() { // Get the name of a card.
static char szName[SIZE_OF_CARD_NAMES];
static char *Numbers[] = {
"1", "2", "3", "4", "5", "6", "7", "8", "9",
"10", "Jack", "Queen", "King"
};
static char *Suits[] = {
"Diamonds", "Hearts", "Clubs", "Spades"
};
if( GetCardinal() < 13)
strcpy_s( szName, SIZE_OF_CARD_NAMES, Numbers[GetCardinal()] );
strcat_s( szName, SIZE_OF_CARD_NAMES, " of " );
switch( GetSuit() ) {
// Diamonds, Hearts, Clubs, and Spades do not need explicit
// class qualifier.
case Diamonds:
strcat_s( szName, SIZE_OF_CARD_NAMES , "Diamonds" );
break;
case Hearts:
strcat_s( szName, SIZE_OF_CARD_NAMES , "Hearts" );
break;
case Clubs:
strcat_s( szName, SIZE_OF_CARD_NAMES , "Clubs" );
break;
case Spades:
strcat_s( szName, SIZE_OF_CARD_NAMES , "Spades" );
break;
}
return szName;
}
Výčtový typ je integrálního typu.Identifikátory představen enum prohlášení lze kdykoli zobrazit konstanty.Obvykle je identifikátor první hodnotu 0 (Diamonds, v předchozím příkladu), a jeden pro každý identifikátor následných zvyšování hodnoty.Tedy hodnotu Spades je 3.
Čítače výčtů nemusí mít jedinečné hodnoty ve výčtu.Název každé čítače výčtu jako konstanty a musí být jedinečný v rámci oboru kde enum je definován.
Všechny čítače výčtu v seznamu, včetně první, můžete inicializovat na jinou hodnotu než výchozí hodnotu.Předpokládejme, že prohlášení o Suit byla následující:
enum Suit {
Diamonds = 5,
Hearts,
Clubs = 4,
Spades
};
Potom hodnoty Diamonds, Hearts, Clubs, a Spades by byla 5, 6, 4 a 5, respektive.Poznámka 5 použita více než jednou.
Výchozí hodnoty pro tyto čítače výčtů zjednodušit provádění NameOf funkce:
#define SIZE_OF_CARD_NAMES 20
char* Card::NameOf() { // Get the name of a card.
static char szName[SIZE_OF_CARD_NAMES];
static char *Numbers[] = {
"1", "2", "3", "4", "5", "6", "7", "8", "9",
"10", "Jack", "Queen", "King"
};
static char *Suits[] = {
"Diamonds", "Hearts", "Clubs", "Spades"
};
if( GetCardinal() < 13)
strcpy_s( szName, SIZE_OF_CARD_NAMES, Numbers[GetCardinal()] );
strcat_s( szName, SIZE_OF_CARD_NAMES, " of " );
strcat_s( szName, SIZE_OF_CARD_NAMES, Suits[GetSuit()] );
return szName;
}
Přístupový objekt funkce GetSuit vrací typ Suit, Výčtový typ.Výčtové typy jsou typy integrálů, lze použít jako argumenty operátor dolní index pole.(Další informace naleznete v tématu Index operátor.)