คลาส 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
.