2012-05-14 4 views
2

У меня есть следующая проблема:Как получить следующее значение перечисления

enum Language { English, French, German, Italian, Spanish }; 

    int main() { 

    Language tongue = German; 
    tongue = static_cast<Language>(tongue + 1); 

     cout << tongue;     

} 

// это возвращает 3 ..... но я хочу, чтобы получить имя языка на индекс 3 .....

+2

Если вы используете индексы, почему не 'станд :: array' или' станд :: VECTOR'? Если вы хотите, чтобы ваши индексы были значимыми (а не просто целыми целыми числами), то «std :: map» является хорошим кандидатом. – chris

+0

Можете ли вы PLZ кодифицировать его для меня, как им не знакомы с синтаксисом C++ –

+0

Я просто хочу получить следующее значение перечисления, если я предоставляю предыдущий. –

ответ

3

Я считаю, что явная посмотреть таблица лучше всего работает, как для преобразования из перечисления в текст и текста в ENUM:

enum Language_Enum 
{ 
    LANGUAGE_FIRST = 0, 
    LANGUAGE_GERMAN = LANGUAGE_FIRST, 
    LANGUAGE_ENGLISH, 
    LANGUAGE_HOPI, 
    LANGUAGE_WELSH, 
    LANGUAGE_TEXAN, 
    LANGUAGE_DUTCH, 
    LANGUAGE_LAST 
}; 

struct Language_Entry 
{ 
    Language_Enum id; 
    const char * text; 
}; 

const Language Entry language_table[] = 
{ 
    {LANGUAGE_GERMAN, "German"}, 
    {LANGUAGE_HOPI, "Hopi"}, 
    {LANGUAGE_DUTCH, "Dutch"}, 
    // ... 
}; 
const unsigned int language_table_size = 
    sizeof(language_table)/sizeof(language_table[0]); 

Задания enum вместе с текстом позволяет изменять порядок перечисления с минимальным эффектом на поисковую систему.

The LANGUAGE_FIRST и LANGUAGE_LAST идентификаторов позволяют итерации перечисления:

Language_Enum l; 
for (l = LANGUAGE_FIRST; l < LANGUAGE_LAST; ++l) 
{ 
    // ... 
} 
2

Не так просто напечатать имя перечисления для заданного значения перечисления в C++. Вместо этого вы можете использовать карту или строковый массив для хранения значений, которые позволяют получить как индекс, так и строковое значение.

+0

можно получить значение индекса, указав имя перечисления или наоборот –

+0

@GhazanfarAli. Вы можете использовать 'std :: distance' с итераторами или адресами, чтобы сделать это, но в этом случае было бы легче прокручивать, как обычный массив, используя указатель-указатель. – chris

+0

, что будет выводиться для этой линии. Tongue = static_cast (1); соиЬ << язык; –

3

Вам нужно будет создать массив строк, который соответствует вашему перечислению, например.

std::string[] LangTxt = { "English", "French", "German", "Italian", "Spanish" }; 

, то вы можете ссылаться на них следующим образом:

cout << LangTxt[tongue]; 

Будьте осторожны, чтобы сохранить определения вместе, хотя таким образом они обновляются бок о бок.

+0

Я всегда удивляюсь, почему первое сообщение всегда получает голос, хотя последующие его почти похожи! – tuxuday

+0

@tuxuday: Из-за этого? –

0

Лучший способ использования перечисления - сначала указать начальное значение для вашего перечисления. перечисление TestEnum { Нулевой = 0, One, Два } Даже вы не указать ничего начальный индекс по умолчанию равен нулю. Чтобы получить значение в определенном указательном простом сделать

TestEnum(index); 
+0

Но все, что вы можете выводить, по-прежнему является индексом с использованием перечисления. – chris

Смежные вопросы