enum sınıfları ("Yeni çeteleler", "güçlü çeteleler") geleneksel C++ numaralandırma ile üç sorunları çözmek: Birisi, bir istemiyor hatalara neden örtülü int
dönüştürmek
- konvansiyonel
enums
bir tamsayı olarak hareket etmek için numaralandırma. konvansiyonel enums
numaralarını dışa aktararak, ad çakışmasına neden olur.
enum
'un temel türü belirtilemez, bu da karışıklığa, uyumluluk sorunlarına neden olur ve bildirimi imkansız hale getirir.
enum class
("güçlü çeteleler") kesinlikle yazılı ve kapsamına eklenir: gösterildiği gibi
enum Alert { green, yellow, orange, red }; // traditional enum
enum class Color { red, blue }; // scoped and strongly typed enum
// no export of enumerator names into enclosing scope
// no implicit conversion to int
enum class TrafficLight { red, yellow, green };
Alert a = 7; // error (as ever in C++)
Color c = 7; // error: no int->Color conversion
int a2 = red; // ok: Alert->int conversion
int a3 = Alert::red; // error in C++98; ok in C++11
int a4 = blue; // error: blue not in scope
int a5 = Color::blue; // error: not Color->int conversion
Color a6 = Color::blue; // ok
, geleneksel çeteleler her zamanki gibi çalışır, ancak artık isteğe ENUM adı ile hak kazanabilirler.
Yeni enumlar "enum sınıfı" dır çünkü geleneksel sayımların (ad değerleri) yönlerini sınıfların yönleriyle (kapsam üyeleri ve dönüşümlerin olmaması) birleştirirler. çeteleler
enum class Color : char { red, blue }; // compact representation
enum class TrafficLight { red, yellow, green }; // by default, the underlying type is int
enum E { E1 = 1, E2 = 2, Ebig = 0xFFFFFFF0U }; // how big is an E?
// (whatever the old rules say;
// i.e. "implementation defined")
enum EE : unsigned long { EE1 = 1, EE2 = 2, EEbig = 0xFFFFFFF0U }; // now we can be specific
Ayrıca sağlayan ileri beyanı:
enum class Color_code : char; // (forward) declaration
void foobar(Color_code* p); // use of forward declaration
// ...
enum class Color_code : char { red, yellow, green, blue }; // definition
yatan tip biri olmalıdır yatan türünü belirtmek için güçlü olmak
numaralandırma basit çalışabilirliği ve garantili boyutlarına izin veren imzalı veya imzasız tamsayı türleri; Varsayılan int
'dur.
- Eşleme sistemleri özel hata kodları: Standart kütüphanesinde ,
enum
sınıfları için kullanılan <system_error>
olarak: enum class errc
;
- İşaretçi güvenlik göstergeleri:
<memory>
olarak: enum class pointer_safety { relaxed, preferred, strict };
- I/O akışı hataları:
<iosfwd>
olarak: enum class io_errc { stream = 1 };
- Asenkron iletişim hata işleme:
<future>
olarak: Bunlardan enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied };
Çeşitli olan operatörler, örneğin ==
tanımlandı.
[wikipedia] 'ya bakabilirsiniz (http://en.wikipedia.org/wiki/C%2B%2B11#Strongly_typed_enumerations)? – Nobody
@Nobody: Evet, wiki'ye baktım ama nasıl kullanılacağını anlayamadım ve ne faydaları var. –