Sdílet prostřednictvím


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.)

Viz také

Referenční dokumentace

C prohlášení výčtu

Klíčových slov jazyka C++

Výčet názvů

Definice konstanty výčtu

Výčtové typy a převody