Aracılığıyla paylaş


C++ numaralandırma bildirimleri

Adlandırılmış sabitlere sıralayıcısını adlı bir dizi oluşan bir kullanıcı tanımlı türü bir numaralandırmadır.

clr çeteleler hakkında daha fazla bilgi için bkz: numaralandırma sınıfı.

enum [tag] [: type] {enum-list} [declarator];   // for definition of enumerated type
enum tag declarator;   // for declaration of variable of type tag

Parametreler

  • tag
    Numaralandırma için belirtilen tür adı.

  • type
    Numaralandırma tanımlayıcıları temel türü.Notlar'a bakın.

  • enum-list
    Numaralandırma tarafından bulunan sıralayıcısını listesi.

  • declarator
    Bildiricisi liste numaralandırma adlarını belirtir.Daha fazla bilgi için bkz. Declarators genel bakış.

Notlar

Bir numaralandırma değerleri aralığını tanımlamak için içerik sağlar.Aşağıdaki örnek, bir deste içinde dört cins içeren bir numaralandırma gösterir.

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

Numaralandırma her adı bir numaralayıcı olur ve karşılık gelen bir değer onun yerine numaralandırma değerlerinin sırasına göre atanır.Varsayılan olarak, ilk değer 0 atanır, sonraki yönteme atanan 1 vb..Bir numaralayıcı değeri ayarlayabilirsiniz.

enum Suit { Diamonds = 1,
             Hearts, 
             Clubs,
             Spades };

Numaralandırıcı Diamonds değeri atanır 1.Bu, sonraki sıralayıcısını atanmış değerler etkiler; Hearts2 değerine atanır Clubs 3 ve böyle devam eder.

C, enum anahtar sözcüğünü bir numaralandırma bildirmek için gereklidir.C++, enum anahtar sözcüğünü atlanmış.Örne?in:

Suit current;          // Legal in C++ only

Bir numaralandýrma üzerinde temel alan bir değişken belirli değerler atanabilir.

Suit currentSuit = Hearts;

Atamak çalışırsanız, hand haftanın bir günü olmayan bir değer

int  myAccountNumber = 012345678;
Suit hand;

hand = myAccountNumber;

Derleyici bir hata olarak bu atama derleme zamanında işaretler.Teknik olarak bu değişkenlerin tamsayıları olmakla birlikte, bir cast dönüştürmek için gerekli bir int için bir numaralandırma.Ancak, başka bir şekilde gidin ve bir dönüþtürme olmadan bir tamsayı değeri için bir sýralayýcý katılmaktadır.

myAccountNumber = hearts;

typetemel türü tanımlayıcıları.Bu imzalanmış veya imzalanmamış sürümleri gibi herhangi bir skalar türü olabilir int, short, veya long.boolveya char de izin verilir.

Bir nesne olarak bilinen ve okunmadığından sınırlı bir değerler kümesi kabul edilebilir, numaralanmýþ türlerde değerli.Bir deste cins örneğinden göz önünde bulundurun:

// 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;
}

Önceki örnekte, bir sınıfı tanımlar Card, iç içe geçmiş bir enum türü içeren Suit.

Çünkü türü Suit yer alan sınıf adı (Card) ortak başvuruları açıkça kullanılmalıdır.Yöntemler, sınıf adı atlanabilir.

İçin sonek artýrma iþlecini Card::Suit için tanımlanmış bir kullanıcı tanımlı artýrma iþlecinin olmadan curSuit artırılamaz.Kullanıcı tanımlı işleçler hakkında daha fazla bilgi için bkz: Private int value.

Aşağıdaki kod, bir deste oluşturur.

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

Karları aþaðýdaki örneði ele alalým NameOf yöntemi.

#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;
}

Bir enum türü ayrılmaz bir türüdür.Tanımlayıcıları ile tanıtılan enum bildirimi sabitleri görünen her yerde kullanılabilir.Normal olarak, ilk tanımlayıcı'nın değeri 0'dır (Diamonds, önceki örnekte), ve birer birer her izleyen bir tanımlayıcı değerleri artırın.Bu nedenle, değeri Spades 3.

Numaralandırıcıları benzersiz değerler bir numaralandırma olması gerekmez.Her bir numaralayıcı adı sabiti olarak kabul edilir ve kapsamı içinde benzersiz olmalıdır nerede enum tanımlanır.

Herhangi bir numaralayıcı listesinde birinci de dahil olmak üzere, varsayılan değeri dışında bir değere başlatılabilir.Bildirimi varsayalım Suit aşağıdaki eklenmiştir:

enum Suit {
   Diamonds = 5,
   Hearts,
   Clubs = 4,
   Spades
};

Sonra değerleri Diamonds, Hearts, Clubs, ve Spades 5, 6, 4 ve 5, sırasıyla olacaktı.5 Kereden fazla kullanıldığını unutmayın.

Uygulaması, bu numaralandırıcıları varsayılan değerlerini basitleştirmek NameOf işlevi:

#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;
}

Erişimci işlevi GetSuit türü verir Suit, bir türü listelenebilir.Numaralanmýþ türlerde ayrılmaz türleri olduðundan, array alt simge işleci için bağımsız değişken olarak kullanılabilir.(Daha fazla bilgi için bkz: Alt simge işleç.)

Ayrıca bkz.

Başvuru

C numaralandırma bildirimleri

C++ anahtar sözcükler

Numaralayıcı adları

Numaralayıcı sabitleri tanımı

Dönüşümler ve numaralanmýþ türleri