2014-01-07 20 views
4
#include <iostream> 

enum SEX {MALE, FEMALE}; 

int main(int argc, char**argv) 
{ 
    enum SEX the_sex = MALE; 
    return 0; 
} 

枚舉的值如何顯示在終端或控制檯上the_sex值,接受來自終端或控制檯值更新the_sex的值以及如何能予有效的輸入爲the_sex變量?顯示,更新和確認在C++

+0

你想要用戶能夠進入什麼? 「MALE」或「FEMALE」大概是? – BoBTFish

+0

@BoBTFish是的,沒關係。 – user2699298

回答

2

How can I accept values from the terminal or console to update the value of the_sex and how can I valid the input for the_sex variable?

輸入可以通過任何你想要被表示爲整數(1男性,2女),一個char(男性「M」,「F」爲女性),一個std::string。下面是該char版本的代碼示例:

char in; 
std::cin >> in; 
switch (in) { 
case 'M': 
    the_sex = MALE; 
    break; 
case 'F': 
    the_sex = FEMALE; 
    break; 
default: 
    // invalid input 
    break; 
} 

,或者這裏的std::string版本:

std::string in; 
std::cin >> in; 
     if (in == "MALE") the_sex = MALE; 
else if (in == "FEMALE") the_sex = FEMALE; 
else // invalid input 

How can I display the_sex value on the terminal or console?

您可以簡單地用一個switch語句打印出的值的SEX變量:

std::ostream& operator<<(std::ostream& os, SEX the_sex) { 
    switch (the_sex) { 
    case MALE: 
     os << "MALE"; 
     break; 
    case FEMALE: 
     os << "FEMALE"; 
     break; 
    } 
    return os; 
} 
+1

更好地重載operator <<而不是僅僅將代碼粘貼到main中並輸出到std :: cout中。 – Puppy

2

要輸出枚舉的值可以簡單地寫

std::cout << the_sex; 

枚舉將顯示爲一個整數值(在此情況下爲1)。

爲了得到和可以使用例如枚舉驗證值我使用宏這樣做下面的循環

int e; 

do 
{ 
    std::cout << "Enter the sex of the person (0 - FEMALE, 1 - MALE): "; 
} while (std::cin >> e && e != 0 && e != 1); 

if (std::cin) the_sex = static_cast<SEX>(e); 
+0

最後一行是什麼'cin'? – Shoe

+0

用戶可以輸入EOF字符(CTRL + Z)。該行檢查用戶是否確實輸入了值而不是EOF。 –

+0

它給了我'錯誤:'cin'未在此範圍內聲明。 – Shoe

2

#define name_num(NAME, ...)             \ 
class NAME {                 \ 
                       \ 
public:                  \ 
                       \ 
    enum enums{NAME_NUM_BEGIN_OF_ENUM_MAP,          \ 
       __VA_ARGS__,             \ 
       NAME_NUM_END_OF_ENUM_MAP};          \ 
                       \ 
    using map_type = boost::bimap<enums, std::string>;       \ 
                       \ 
    NAME(std::string const& str) {            \ 
    std::vector<std::string> v;            \ 
    boost::split(v, str, boost::is_any_of(", "), boost::token_compress_on); \ 
    map_type m;                \ 
                       \ 
    for(int i=NAME_NUM_BEGIN_OF_ENUM_MAP+1; i!=NAME_NUM_END_OF_ENUM_MAP; i++) \ 
     map_.insert(map_type::value_type(static_cast<enums>(i), v[i-1]));  \ 
    }                   \ 
                       \ 
    std::string string(enums val)  { return map_.left.at(val); }   \ 
                       \ 
    enums number(std::string const& val) { return map_.right.at(val); }   \ 
                       \ 
private:                  \ 
    map_type map_;                \ 
} NAME(#__VA_ARGS__) 

它創建一個通常的枚舉列表,可以照常使用(例如在交換機中)。還使用boost bimap將枚舉映射到相應的字符串。

宏的第一個參數是用於訪問枚舉和方法的類實例的名稱。

找到您使用的枚舉number並找到您使用的字符串string方法。如果字符串(在方法編號中)沒有指向一個有效的枚舉,則會拋出一個std::out_of_range("bimap<>: invalid key")

參見this的例子。