2011-01-07 37 views
26

Tôi hiểu cái đầu tiên nhưng cái thứ hai? Khi nào và tại sao bạn sẽ làm điều đó?Việc sử dụng enum không có tên biến

enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE }; 

enum { HOMER, MARGE, BART, LISA, MAGGIE }; 
+4

khi bạn đã xem quá nhiều Simpsons ??? –

+4

Không có điều như vậy .. –

+0

@ Noah: bạn làm tôi nghĩ rằng có lẽ nó thực sự là bất hợp pháp và tôi gây hiểu lầm, vì vậy tôi đã biên soạn một thử nghiệm tương tự như ví dụ của tôi dưới đây trên g ++. Nó biên dịch và chạy ok, mặc dù tài liệu tham khảo trực tuyến tôi đã kiểm tra thực sự không hiển thị tùy chọn cú pháp này. – davka

Trả lời

24

bạn có thể xác định enum như vậy trong một lớp học ,, cung cấp cho nó phạm vi và giúp hiển thị các khả năng của lớp học, ví dụ:

class Encryption { 
public: 
    enum { DEFAUTL_KEYLEN=16, SHORT_KEYLEN=8, LONG_KEYLEN=32 }; 
    // ... 
}; 

byte key[Encryption::DEFAUTL_KEYLEN]; 
+2

Bây giờ tôi thấy, tôi đã tự hỏi về cách bạn sử dụng/truy cập nó. Vì vậy, nó đưa nó vào phạm vi và sử dụng nó bằng cách làm giá trị ClassName :: enum, vì vậy về cơ bản enum {blah, hah, lol} sau đó có thể truy cập thông qua ClassName :: blah và vv. Cảm ơn. – RoR

6

này chỉ đơn giản là tạo ra biểu thức hằng số mà có giá trị tương ứng, mà không có một loại khác hơn là chỉ đơn giản là int, vì vậy bạn không thể sử dụng một enum giấu tên như một kiểu cho bất cứ điều gì, bạn sẽ phải chỉ đơn giản là chấp nhận một int và sau đó so sánh với hằng số.

Something như thế này:

void doSomething(int c); 

so với một cái gì đó như thế này:

void doSomething(cartoon c); 

Bằng cách này, thực hiện của bạn sẽ là như nhau, vì vậy trong trường hợp của enums giấu tên, nhược điểm duy nhất thực sự gõ mạnh.

+0

Trừ khi chúng không thực sự là hằng số, chúng là * biểu thức liên tục *. Có một sự khác biệt đôi khi lớn. Ví dụ, bạn có thể lấy một tham chiếu hoặc địa chỉ cho một hằng số. Bạn không thể làm điều đó với các biểu tượng enum. –

4

enum, union, struct và class có phần chung trong cú pháp chia sẻ giống nhau Mẫu chưa được đặt tên này hiếm khi được sử dụng. Nhưng đôi khi bạn có thể tìm thấy điều này.

typedef enum { HOMER, MARGE, BART, LISA, MAGGIE } cartoont; 

Hoặc nếu bạn có một biến duy nhất chỉ chứa một vài trạng thái.

enum { HOMER, MARGE, BART, LISA, MAGGIE } my_var; 

Điều này tránh tuyên bố sau.

enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE }; 
cartoon my_var; 
6

Thứ hai là tên chưa đặt tên enum. Tôi có thể hữu ích khi bạn cần các trường, nhưng bạn không có ý định khai báo một biến của kiểu liệt kê này.

Để cung cấp ví dụ 'rất C++' về việc sử dụng nó, bạn thường thấy điều này trong lập trình meta mẫu nơi enum được sử dụng như 'giá trị trả về thời gian biên dịch' mà không có ý định khai báo biến này:

template<class T> 
struct some_metafunction 
{ 
    enum { res = 0; }; 
}; 
+0

Phần '= 0; 'có thực sự cần thiết không? –

+0

@ Jacob Nó không phải, nhưng nó chỉ là một ví dụ (thường là giá trị của 'res' sẽ phụ thuộc vào' T') – icecrime

2

Tôi chỉ cung cấp một ví dụ sử dụng thực tế về enumous enum mà tôi gặp phải trong một dự án được nhúng. Trong dự án, EEPROM được sử dụng để lưu trữ một số tham số. Giả sử các tham số này là lứa tuổi của người chơi thùng carton, mỗi tham số có kích thước 1 byte ở địa chỉ liên tục.

Các thông số này được sao chép vào một mảng được lưu trữ trong ROM khi bộ xử lý được bật nguồn.

uint8_t ROM_AGE[END_AGE] 

Nếu chúng ta xác định một enum anomymous đây:

enum { HOMER_AGE, MARGE_AGE, BART_AGE, LISA_AGE, MAGGIE_AGE, END_AGE }; 

Sau đó, các từ khóa trong enum có thể được sử dụng để chỉ số tuổi của mỗi nhân vật như ROM_AGE[HOMER_AGE]. Bằng cách sử dụng enum này, khả năng đọc tốt hơn nhiều so với sử dụng ROM_AGE[0].

Các vấn đề liên quan