2011-05-09 180 views
5
enum options {Yes,No}; 

class A{ 
    int i; 
    string str; 
    options opt; 
}; 


int main{ 
    A obj; 
    obj.i=5; 
    obj.str="fine"; 
    obj.opt="Yes"; // compiler error 
} 

如何分配const char *來選擇?分配值枚舉類型

回答

13

只是做

obj.opt=Yes; 

此代碼:

obj.opt="Yes"; 

嘗試分配字符串文本(一個完全不同的類型),以枚舉類型,C++不自動地轉換爲您服務。

如何指定const char *來選擇?

您必須手動執行此操作,我喜歡保留一組免費的函數來執行像這樣的轉換,即我將枚舉包裝在命名空間中,並提供一些工作函數與他們同在

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 
} 

現在你可以這樣做:

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

... 


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

所以你可以看到,在C++枚舉可能不給你在其他語言中枚舉所有的花裏胡哨。你必須自己手動轉換東西。

+0

我還提供了from/to字符串轉換函數(事實上,我已經將枚舉創建包裝在一個宏中,以便它們全部提供),它只是更容易在調試日誌中讀取並傳遞爲參數(將被解析)。 – 2011-05-09 14:58:12

1

你不能這樣做。你將不得不使用一些字符串比較並設置它。

3

枚舉不是字符串,但只是重視

obj.opt = Yes; 
3

因爲一個枚舉值不是一個字符串。這是正確的:

int main{ 
    A obj; 

    obj.opt=Yes; 
} 
1

在你的情況,你可以「轉換」枚舉const char*。所有你需要的是創建宏。例如: #define ENUM_TO_CSTR(x) #x 然後: obj.opt=ENUM_TO_CSTR(Yes)

這個宏會將你傳遞給它的所有東西都轉換成類C字符串。它不會轉換變量值,而只是它的名字!

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

會在屏幕上打印x(不10),所以一定要小心使用它!

0

當您嘗試分配「是」時,這意味着您正試圖從枚舉選項中分配一個字符串值而不是枚舉常量。相反,使用語法:

obj.opt = Yes; 

嘗試從OBJ打印選擇的值:

cout << obj.opt; 

你會得到輸出爲0,因爲枚舉指數從0開始是爲0,沒有1 。