2015-02-24 14 views
5

sự khác biệt giữa các định nghĩa static enumenum là gì khi được định nghĩa bên trong một khai báo lớp như hình dưới đây?C++ khai báo enum tĩnh vs enum trong một lớp học

class Example 
{ 
    Example(); 
    ~Example(); 

    static enum Items{ desk = 0, chair, monitor }; 
    enum Colors{ red = 0, blue, green }; 
} 

Ngoài ra, vì chúng tôi đang xác định loại trong lớp, chúng tôi gọi chúng là gì? Tương tự nếu tôi định nghĩa một biến trong một lớp, chúng ta gọi nó là biến thành viên.

+0

Bạn đang sử dụng trình biên dịch nào? Nó sẽ làm tôi ngạc nhiên nếu điều này biên dịch, như 'tĩnh' sẽ không có ý nghĩa nhiều ở đây. – swalog

+0

Nếu bạn đang sử dụng C++ 11, hãy xem xét sử dụng 'enum class'. – Dai

+0

Trình chỉ định 'tĩnh' không hợp lệ trong khai báo enum. Điều này không nên biên dịch. –

Trả lời

7

static không thể áp dụng cho các tờ khai enum, vì vậy mã của bạn không hợp lệ.

Từ N3337, §7.1.1/5 [dcl.stc]

Từ khoá static thể được áp dụng chỉ đến tên của các biến và các hàm và công đoàn vô danh ...

Một enum khai là không ai trong số những người.

Bạn có thể tạo một phiên bản của enum và thực hiện static nếu bạn muốn.

class Example 
{ 
    enum Items{ desk = 0, chair, monitor }; 
    static Items items; // this is legal 
}; 

Trong trường hợp này items là giống như bất kỳ static data member khác.


Đây là một MSVC bug; từ báo cáo lỗi được liên kết có vẻ như trình biên dịch sẽ cho phép cả hai thông số staticregister lưu trữ trên tờ khai enum. Lỗi đã được đóng như cố định, vì vậy có thể sửa chữa sẽ có sẵn trong VS2015.

+0

Tôi tự hỏi, tuy nhiên, tại sao 'static' ở đây không được thực hiện để áp dụng cho tập hợp 0 ​​thành viên dữ liệu được khai báo trong khai báo này. Sau khi tất cả, nếu bạn đã làm mục 'static enum Items {...};', nó sẽ là hợp lệ. – Brian

+0

@Brian Tôi không hiểu ý bạn là gì * tập hợp của 0 thành viên dữ liệu *. Có hoặc là một thành viên dữ liệu hoặc không có, và nếu không có thì những gì sẽ lưu trữ specifier áp dụng cho? – Praetorian

+0

Cũng vì có một tập hợp gồm 0 thành viên dữ liệu, bạn phải thực sự tạo một bộ để bắt đầu. Sử dụng 'enum' giống như mô tả một bộ sẽ trông như thế nào nếu bạn tạo một bộ. Nó không thực sự tạo ra bất cứ điều gì, mặc dù, như trái ngược với ví dụ của bạn. – NoseKnowsAll

0

static là bộ lưu trữ C++. Nó có nghĩa là giá trị của thành viên này của lớp là như nhau cho tất cả các trường hợp của lớp. Không có gì đặc biệt về enums ở đây.

EDIT: Ngay cả những static thẻ wiki có một lời giải thích. Về chính xác chủ đề này.

EDIT2: Ồ, tôi đã đọc sai mã của bạn. Không có enum tĩnh. Bạn có thể có một biến tĩnh của một kiểu enum chứa một giá trị.

+0

Một 'enum' là không có biến. –

+0

có, nhưng một biến lưu trữ trạng thái được mã hóa trong một enum là. –

+0

Nhưng anh ta không hỏi về những người đó. –

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