Các lớp enum ("enum mới", "enum mạnh") giải quyết ba vấn đề với kiểu liệt kê C ++ truyền thống:
enums
chuyển đổi ngầm quy ước sang int
, gây ra lỗi khi ai đó không muốn một kiểu liệt kê hoạt động như một số nguyên.
- thông thường
enums
xuất điều tra viên của họ ra phạm vi xung quanh, gây ra xung đột tên.
- Loại cơ bản của một
enum
không thể được chỉ định, gây ra sự nhầm lẫn, các vấn đề tương thích và làm cho việc khai báo chuyển tiếp không thể thực hiện được.
enum class
("enums mạnh") được gõ mạnh và có phạm vi:
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;
Như được hiển thị, enum truyền thống hoạt động như bình thường, nhưng bây giờ bạn có thể tùy chọn đủ điều kiện với tên của enum.
Các enum mới là "enum class" vì chúng kết hợp các khía cạnh của kiểu liệt kê truyền thống (giá trị tên) với các khía cạnh của các lớp (các thành viên có phạm vi và không có chuyển đổi).
Có thể chỉ định kiểu cơ bản cho phép khả năng tương tác đơn giản hơn và kích thước được đảm bảo của bảng liệt kê:
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 };
Nó cũng cho phép khai báo phía trước các enums:
enum class Color_code : char;
void foobar(Color_code* p);
enum class Color_code : char { red, yellow, green, blue };
Kiểu cơ bản phải là một trong các kiểu số nguyên có dấu hoặc không dấu; mặc định là int
.
Trong thư viện chuẩn, enum
các lớp được sử dụng cho:
- Hệ thống bản đồ mã lỗi cụ thể: Trong
<system_error>
: enum class errc
;
- Các chỉ số an toàn của con trỏ: Trong
<memory>
:enum class pointer_safety { relaxed, preferred, strict };
- Lỗi luồng I / O: Trong
<iosfwd>
:enum class io_errc { stream = 1 };
- Xử lý lỗi truyền thông không đồng bộ: Trong
<future>
:enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied };
Một số trong số này có các toán tử, chẳng hạn như ==
được định nghĩa.
enum class Colours
vàenum class Fruits
. Bởi vì khi tôi viết mã trong VS 2010. Nó ném một lỗi"expects a defination or a tag name"
bên dướiclass
.