คลาส enum ("new enums", "strong enums") ช่วยแก้ปัญหาสามประการเกี่ยวกับการแจงนับ C ++ แบบเดิม:
- การชุมนุม
enumsโดยปริยายแปลงintที่ก่อให้เกิดข้อผิดพลาดเมื่อมีคนไม่ต้องการการแจงนับจะทำหน้าที่เป็นจำนวนเต็ม
- การ
enumsส่งออกตัวนับแบบเดิมไปยังขอบเขตโดยรอบทำให้เกิดการขัดแย้งกัน
enumไม่สามารถระบุประเภทพื้นฐานของ an ได้ทำให้เกิดความสับสนปัญหาความเข้ากันได้และทำให้ไม่สามารถประกาศล่วงหน้าได้
enum class ("strong enums") ถูกพิมพ์อย่างรุนแรงและกำหนดขอบเขต:
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;
ดังที่แสดงไว้ enums แบบดั้งเดิมทำงานได้ตามปกติ แต่ตอนนี้คุณสามารถเลือกที่จะมีคุณสมบัติตามชื่อของ enum ได้
enums ใหม่คือ "enum class" เนื่องจากรวมแง่มุมของการแจงนับแบบดั้งเดิม (ค่าชื่อ) กับแง่มุมของคลาส (สมาชิกที่กำหนดขอบเขตและไม่มีการแปลง)
ความสามารถในการระบุประเภทพื้นฐานทำให้สามารถทำงานร่วมกันได้ง่ายขึ้นและขนาดการแจงนับที่รับประกัน:
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 };
นอกจากนี้ยังเปิดใช้งานการประกาศ enums ล่วงหน้า:
enum class Color_code : char;
void foobar(Color_code* p);
enum class Color_code : char { red, yellow, green, blue };
ประเภทที่อยู่ภายใต้ต้องเป็นหนึ่งในประเภทจำนวนเต็มที่ลงชื่อหรือไม่ได้ลงชื่อ intเริ่มต้นคือ
ในไลบรารีมาตรฐานenumคลาสใช้สำหรับ:
- รหัสข้อผิดพลาดเฉพาะของระบบการแมป: ใน
<system_error>: enum class errc;
- ตัวชี้ความปลอดภัย: ใน
<memory>:enum class pointer_safety { relaxed, preferred, strict };
- ข้อผิดพลาดในการสตรีม I / O: ใน
<iosfwd>:enum class io_errc { stream = 1 };
- การจัดการข้อผิดพลาดการสื่อสารแบบอะซิงโครนัส: ใน
<future>:enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied };
หลายตัวมีตัวดำเนินการเช่นที่==กำหนดไว้
enum class Coloursและenum class Fruits. เพราะเมื่อฉันเขียนโค้ดใน VS 2010 มันแสดงข้อผิดพลาด"expects a defination or a tag name"ภายใต้class.