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 *
來選擇?分配值枚舉類型
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 *
來選擇?分配值枚舉類型
只是做
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++枚舉可能不給你在其他語言中枚舉所有的花裏胡哨。你必須自己手動轉換東西。
你不能這樣做。你將不得不使用一些字符串比較並設置它。
枚舉不是字符串,但只是重視
obj.opt = Yes;
因爲一個枚舉值不是一個字符串。這是正確的:
int main{
A obj;
obj.opt=Yes;
}
在你的情況,你可以「轉換」枚舉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
),所以一定要小心使用它!
當您嘗試分配「是」時,這意味着您正試圖從枚舉選項中分配一個字符串值而不是枚舉常量。相反,使用語法:
obj.opt = Yes;
嘗試從OBJ打印選擇的值:
cout << obj.opt;
你會得到輸出爲0,因爲枚舉指數從0開始是爲0,沒有1 。
我還提供了from/to字符串轉換函數(事實上,我已經將枚舉創建包裝在一個宏中,以便它們全部提供),它只是更容易在調試日誌中讀取並傳遞爲參數(將被解析)。 – 2011-05-09 14:58:12