Deklaracje wyliczania C++
Wyliczenie to typ zdefiniowany przez użytkownika składające się z zestawem stałych o nazwie moduły wyliczające.
Informacji na temat środowiska CLR wyliczenia, zobacz Wylicz klasy.
enum [tag] [: type] {enum-list} [declarator]; // for definition of enumerated type
enum tag declarator; // for declaration of variable of type tag
Parametry
tag
Nazwa typu podana do wyliczania.type
Typ podstawowy identyfikatory wyliczania.Zobacz uwagi.enum-list
Lista moduły wyliczające zawartych przez wyliczenie.declarator
Listy; niewłaściwy deklarator, która określa nazwy wyliczenia.Aby uzyskać więcej informacji, zobacz Omówienie Declarators.
Uwagi
Wyliczenie zapewnia kontekst opisać zakres wartości.Poniższy przykład pokazuje wyliczenie, który zawiera cztery kolory w talii kart.
enum Suit { Diamonds, Hearts, Clubs, Spades };
Każda nazwa wyliczania staje się moduł wyliczający i przypisano wartość, która odpowiada jego miejsce w kolejności wartości w wyliczeniu.Domyślnie pierwsza wartość jest przypisany do 0, następny jest przypisany 1 i tak dalej.Można ustawić wartość moduł wyliczający.
enum Suit { Diamonds = 1,
Hearts,
Clubs,
Spades };
Moduł wyliczający Diamonds jest przypisana wartość 1.Ma to wpływ na wartości, które są przypisane do kolejnych moduły wyliczające; Heartsprzypisano wartość 2, Clubs 3 i tak dalej.
C enum słowo kluczowe jest wymagane Aby zadeklarować wyliczenie.W języku C++ enum mogą być pominięte słowo kluczowe.Na przykład:
Suit current; // Legal in C++ only
Zmienna, oparte na wyliczenie można przypisać określone wartości.
Suit currentSuit = Hearts;
Jeśli próby przypisać hand wartość, która nie jest dzień tygodnia,
int myAccountNumber = 012345678;
Suit hand;
hand = myAccountNumber;
Kompilator flagi tego przydziału jako błąd w czasie kompilacji.Chociaż technicznie obu zmiennych są numery integer, wymaganego do konwertowania rzutowania int do wyliczenia.Jednak można go w inny sposób i promowania moduł wyliczający na wartość liczbową bez rzutowania.
myAccountNumber = hearts;
typeTyp podstawowy jest identyfikatorów.Może to być dowolnego typu skalarnych, takich jak podpisane lub niepodpisane wersje int, short, lub long.boollub char jest również dozwolone.
Typy wyliczeniowe są cenne, gdy obiekt można przyjąć, znane i racjonalnie ograniczony zestaw wartości.Rozważmy przykład grupy z talii kart:
// 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;
}
Powyższy przykład zawiera definicję klasy, Card, który zawiera zagnieżdżony Typ wyliczany Suit.
Ponieważ typ Suit jest zagnieżdżony, nazwy klasy (Card) muszą być wyraźnie używane w publicznych odniesienia.W metodach można pominąć nazwę klasy.
Operator przyrostu przyrostkowe dla Card::Suit jest zdefiniowany, ponieważ bez operatora przyrostu zdefiniowane przez użytkownika, curSuit nie może być zwiększany.Aby uzyskać więcej informacji na temat operatorów zdefiniowanych przez użytkownika, zobacz Przeciążanie.
Poniższy kod tworzy pack kart.
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 );
Rozważmy następujący przykład w odniesieniu do NameOf metody.
#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;
}
Typ wyliczany jest typem całkowitym.Identyfikatory wprowadzone z enum deklaracji można tam, gdzie pojawiają się stałe.Normalnie, identyfikator pierwsza wartość jest równa 0 (Diamonds, w poprzednim przykładzie), oraz wartości zwiększa o jeden dla każdego identyfikatora uprawianych następczo.W związku z tym, wartość Spades jest 3.
Moduły wyliczające nie wymagają unikatowych wartości w wyliczenie.Nazwa każdego modułu wyliczającego jest traktowana jako stała i musi być unikatowa w obrębie zakresu gdzie enum jest zdefiniowany.
Każdy moduł wyliczający na liście, łącznie z pierwszą z nich, mogą być inicjowane na wartość inną niż jego wartość domyślna.Załóżmy, że deklaracja z Suit były następujące:
enum Suit {
Diamonds = 5,
Hearts,
Clubs = 4,
Spades
};
Następnie wartości Diamonds, Hearts, Clubs, i Spades byłaby 5, 6, 4 i 5, odpowiednio.Należy zauważyć, że 5 jest używany więcej niż jeden raz.
Wartości domyślne dla tych moduły wyliczające uproszczenia realizacji NameOf funkcji:
#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;
}
Funkcja akcesor GetSuit zwraca wartość typu Suit, typ wyliczeniowy.Ponieważ typy wyliczane są typy zintegrowane, mogą być używane jako argumentów dla operatora indeks tablicy.(Aby uzyskać więcej informacji, zobacz Indeks dolny Operator.)