2012-04-10 33 views
9

tôi có lớp học như sau:Truy cập để enum giá trị bằng '::' trong C++

class Car 
{ 
public: 
    Car(); 
    // Some functions and members and <b>enums</b> 
    enum Color 
    { 
     Red, 
     Blue, 
     Black 
    }; 
    Color getColor(); 
    void setColor(Color); 
private: 
    Color myColor; 
} 

Tôi muốn:

  1. quyền truy cập vào Color giá trị như Color::Red. Nó thực sự là khó để hiểu mã khi Car::Red được sử dụng, khi lớp có một sự đếm rất nhiều, lớp con, vv
  2. sử dụng loại Color như là đối số chức năng hoặc giá trị trả về
  3. sử dụng loại biến Color trong switch

tôi biết 3 giải pháp phần:

  1. Sử dụng nhúng lớp Color và enum trong đó
  2. Sử dụng nhúng nam espace Color và enum trong đó
  3. Sử dụng enum class

1 và 2 giải pháp giải quyết một vấn đề Color::Red gia nhập, nhưng tôi không thể sử dụng các chức năng như Color getColor()void setColor(Color).

3 giải pháp có vấn đề: VS2010 doen't support enum class. GCC v.4.1.2 cũng không hỗ trợ nó. Tôi không biết về các phiên bản sau của gcc.

Có, tôi đang làm việc trên dự án đa nền tảng.
Tôi đã tìm thấy giải pháp this, nhưng có vẻ như ... nặng.
Tôi hy vọng ai đó có thể giúp tôi đây :)

+2

GCC 4.6 (với '-std = C++ 0x') hỗ trợ' enum class', và cũng cho phép 'Color :: Red' cho các enums thông thường. – leftaroundabout

+0

lưu ý phụ, vui lòng thụt lề mã với 4 dấu cách thay vì sử dụng thẻ trước/mã – CharlesB

+0

Tôi tìm thấy so với VS2010 đã ** hỗ trợ một phần ** [enums gõ mạnh] (http://www.open-std.org/jtc1/ sc22/wg21/docs/papers/2007/n2347.pdf). – Jury

Trả lời

13

Trong C hiện ++ (ví dụ C++ 11 và hơn thế nữa), bạn có thể đã truy cập vào các giá trị enum như thế:

enum Color { Red }; 
Color c = Color::Red; 
Color d = Red; 

bạn có thể đi xa hơn và buộc việc sử dụng này không ation:

enum class Color { Red }; 
Color c = Color::Red; 
// Color d = Red; <-- error now 

Và trên một sidenote, bây giờ bạn xác định loại cơ bản, mà trước đây chỉ có thể với mã hacky (FORCEDWORD hoặc lâu hơn bất cứ ai?):

enum class Color : char { Red }; 
+0

Bạn nói đúng, nhưng không có trình biên dịch nào hỗ trợ đầy đủ các tính năng của C++ 11. Có, GCC 4.6 và 4.7 hỗ trợ nó, nhưng dự án của tôi cũng phải được biên dịch cho Windows. VS2010 không hỗ trợ nó. Có thể bạn biết một số miếng vá cho nó? – Jury

+0

Bạn có thể thử MinGW, là cổng cửa sổ của GCC. MSVC là nguồn đóng và không có bản vá lỗi. –

7

Tên enum bên trong lớp lồng nhau (như ví dụ một):

class Car 
{ 
public: 
    struct Color 
    { 
     enum Type 
     { 
      Red, 
      Blue, 
      Black 
     }; 
    }; 

    Color::Type getColor(); 
    void setColor(Color::Type); 
}; 
+1

Bạn cũng có thể đề cập đến tính năng 'C++ 11'' enum class'. – iammilind

+0

Và sử dụng getter và setter của 'Color' trong getter và setter của' Car'? – Jury

+0

Phần 'Color ::' không cần thiết ở đây? – Konrad

5

Khi tôi muốn làm một cái gì đó như thế này tôi có xu hướng sử dụng một không gian tên và một typedef bên ngoài không gian tên thứ (mặc dù thông thường tôi đang làm điều này trên toàn cầu hơn là bên trong một lớp). Một cái gì đó như thế này:

namespace colors 
{ 
    enum Color 
    { 
     Red, 
     Blue 
     ... 
    } 
} 
typedef colors::Color Color; 

Bằng cách này bạn sử dụng không gian tên để có được màu sắc thực tế, nhưng Color loại chính nó là vẫn truy cập trên toàn cầu:

Color myFav = colors::Red; 
+0

VS2010: lỗi C2059: lỗi cú pháp: 'không gian tên' | GCC 4.1.2: lỗi: dự kiến ​​không đủ tiêu chuẩn-id trước 'namespace' – Jury

+0

@Jury Có lẽ vì bạn không được phép khai báo các không gian tên bên trong các lớp. Như tôi đã nói, tôi thường làm điều này trên toàn cầu. Bạn luôn có thể sử dụng một lớp lồng nhau nếu bạn thực sự muốn giữ nó trong một lớp - nguyên tắc giống nhau. – obmarg

+0

typedef không thực sự cần thiết, và tôi sẽ đặt màu là tên không gian tên và không đặt tên cho enum. Tôi sử dụng phương pháp không gian tên tất cả các thời gian vì nó rất thanh lịch. Dưới đây là một số thông tin thêm về cách sử dụng enums: http://inphamousdevelopment.wordpress.com/2012/04/02/enumeration-and-arrays/ – alex

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