Numaralandırma sınıfları ("yeni numaralandırmalar", "güçlü numaralandırmalar") geleneksel C ++ numaralandırmalarıyla üç sorunu ele alır:
- geleneksel
enums
örtük olarak dönüştürür int
, birisi bir numaralandırmanın bir tamsayı olarak davranmasını istemediğinde hatalara neden olur.
- geleneksel
enums
numaralayıcıları çevreleyen kapsama ihraç ederek ad çatışmalarına neden olur.
- Bir türünün temelindeki
enum
belirtilemez, bu da karışıklığa, uyumluluk sorunlarına neden olur ve ileri bildirimi imkansız hale getirir.
enum class
("güçlü numaralandırmalar") güçlü bir şekilde yazılır ve kapsamları belirlenir:
enum Alert { green, yellow, orange, red };
enum class Color { red, blue };
enum class TrafficLight { red, yellow, green };
Alert a = 7;
Color c = 7;
int a2 = red;
int a3 = Alert::red;
int a4 = blue;
int a5 = Color::blue;
Color a6 = Color::blue;
Gösterildiği gibi, geleneksel numaralandırmalar her zamanki gibi çalışır, ancak artık isteğe bağlı olarak numaralandırmanın adıyla nitelendirebilirsiniz.
Yeni numaralandırmalar "enum sınıfı" dır çünkü geleneksel numaralandırmaların yönlerini (ad değerleri) sınıfların yönleriyle (kapsamlı üyeler ve dönüşüm yokluğu) birleştirirler.
Temel türü belirleyebilmek, daha basit birlikte çalışabilirliğe ve garantili numaralandırma boyutlarına izin verir:
enum class Color : char { red, blue };
enum class TrafficLight { red, yellow, green };
enum E { E1 = 1, E2 = 2, Ebig = 0xFFFFFFF0U };
enum EE : unsigned long { EE1 = 1, EE2 = 2, EEbig = 0xFFFFFFF0U };
Ayrıca numaralandırmaların ileriye doğru bildirimini sağlar:
enum class Color_code : char;
void foobar(Color_code* p);
enum class Color_code : char { red, yellow, green, blue };
Temel tür, işaretli veya işaretsiz tam sayı türlerinden biri olmalıdır; varsayılan değer int
.
Standart kitaplıkta, enum
sınıflar şunlar için kullanılır:
- Haritalama sistemleri belirli hata kodları: In
<system_error>
: enum class errc
;
- İşaretçi güvenlik göstergeleri: Giriş
<memory>
:enum class pointer_safety { relaxed, preferred, strict };
- G / Ç akışı hataları: Giriş
<iosfwd>
:enum class io_errc { stream = 1 };
- Eşzamansız iletişim hatası işleme: Giriş
<future>
:enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied };
Bunların birçoğunun ==
tanımlandığı gibi işleçleri vardır .
enum class Colours
veenum class Fruits
. Çünkü VS 2010'da kodu yazdığımda"expects a defination or a tag name"
altına bir hata atıyorclass
.