2011-05-09 44 views

Trả lời

13

Chỉ cần làm

obj.opt=Yes; 

Mã này:

obj.opt="Yes"; 

cố gắng gán một chuỗi chữ (một loại hoàn toàn khác nhau) để một kiểu enum, mà C++ không Automagically chuyển đổi cho bạn.

Làm cách nào có thể gán const char * để chọn?

Bạn sẽ phải làm điều này bằng tay, tôi muốn giữ một tập hợp các chức năng miễn phí xung quanh để thực hiện chuyển đổi như thế này với sự đếm của tôi, tức là tôi sẽ quấn enums của tôi trong một không gian tên và cung cấp một số chức năng để làm việc với họ:

namespace options 
{ 
    enum Enum {Yes,No,Invalid}; 
    Enum FromString(const std::string& str); 
    // might also add ToString, ToInt, FromInt to help with conversions 
} 

Enum FromString(const std::string& str) 
{ 
    if (str == "Yes") 
    { 
     return Yes   
    } 
    else if (str == "No") 
    { 
     return No; 
    } 
    return Invalid; //optionally throw exception 
} 

Bây giờ bạn có thể làm:

class A{ 
    int i; 
    string str; 
    options::Enum opt; // notice change here 
}; 

... 


obj.opt=options::FromString("Yes"); 

Vì vậy, bạn có thể thấy, sự đếm trong C++ có lẽ không cung cấp cho bạn tất cả các chuông và còi của sự đếm bằng các ngôn ngữ khác. Bạn sẽ phải tự mình chuyển đổi mọi thứ.

+0

Tôi cũng cung cấp các hàm chuyển đổi từ/sang chuỗi (trên thực tế, tôi đã bao bọc việc tạo enum trong macro chỉ để chúng được cung cấp mọi lúc), nó dễ đọc hơn trong nhật ký gỡ lỗi và chuyển tham số (để được phân tích cú pháp). –

1

Bạn không thể thực hiện việc này. Bạn sẽ phải sử dụng một số so sánh chuỗi và thiết lập nó.

3

Enums không dây, nhưng chỉ đánh giá cao

obj.opt = Yes; 
3

Bởi vì một giá trị enum không phải là một chuỗi. Đây là chính xác:

int main{ 
    A obj; 

    obj.opt=Yes; 
} 
1

Trong trường hợp của bạn, bạn có thể "chuyển đổi" enum để const char*. Tất cả những gì bạn cần là tạo macro. Ví dụ: #define ENUM_TO_CSTR(x) #x và sau đó: obj.opt=ENUM_TO_CSTR(Yes).

Macro này sẽ chuyển đổi mọi thứ bạn chuyển sang chuỗi thành chuỗi C. Nó sẽ không chuyển đổi giá trị biến, nhưng chỉ có tên của nó!

int x = 10; cout << ENUM_TO_CSTR(x) << endl;

Sẽ in x (không 10) trên màn hình, vì vậy hãy cẩn thận sử dụng nó!

0

Khi bạn cố gắng gán "Có", điều đó có nghĩa là bạn đang cố gán một giá trị chuỗi chứ không phải hằng số enum từ các tùy chọn enum. Thay vì sử dụng cú pháp:

obj.opt = Yes; 

Thử in giá trị của lựa chọn từ obj:

cout << obj.opt; 

Bạn sẽ nhận được đầu ra là 0, vì chỉ số enum bắt đầu từ 0. Có là 0 và Không là 1 .

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