Выбрать главу

// Слово "McIntosh" на экран таким образом не попадет.

fruit = McIntosh;

cout << fruit;

He забывайте, что символ McIntosh — это просто имя для некоторого целочисленного значения, а не строка. Следовательно, при выполнении предыдущего кода на экране отобразится числовое значение константы McIntosh, а не строка "McIntosh". Конечно, можно создать код ввода и вывода символов перечисления в виде строк, но он выходит несколько громоздким. Вот, например, как можно отобразить на экране названия сортов яблок, связанных с переменной fruit.

switch(fruit) {

 case Jonathan: cout << "Jonathan";

  break;

 case Golden_Declass="underline" cout << "Golden Delicious";

  break;

 case Red_Declass="underline" cout << "Red Delicious";

  break;

 case Winesap: cout << "Winesap";

  break;

 case Cortland: cout << "Cortland";

  break;

 case McIntosh: cout << "McIntosh";

  break;

}

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

#include <iostream>

using namespace std;

enum apple {Jonathan, Golden_Del, Red_Del, Winesap, Cortland, McIntosh};

// Массив строк, связанных с перечислением apple.

char name[][20] = {

 "Jonathan",

 "Golden Delicious",

 "Red Delicious",

 "Winesap",

 "Cortland",

 "McIntosh",

};

int main()

{

 apple fruit;

 fruit = Jonathan;

 cout << name[fruit] << '\n';

 fruit = Winesap;

 cout << name[fruit] << '\n';

 fruit = McIntosh;

 cout << name[fruit] << '\n';

 return 0;

}

Результаты выполнения этой программы таковы.

Jonathan

Winesap

McIntosh

Использованный в этой программе метод преобразования значения перечисления в строку можно применить к перечислению любого типа, если оно не содержит инициализаторов. Для надлежащего индексирования массива строк перечислимые константы должны начинаться с нуля, быть строго упорядоченными по возрастанию, и каждая следующая константа должна быть больше предыдущей точно на единицу.

Из-за того, что значения перечисления необходимо вручную преобразовывать в удобные для восприятия человеком строки, они, в основном, используются там, где такое преобразование не требуется. Для примера рассмотрите перечисление, используемое для определения таблицы символов компилятора.

Ключевое слово typedef

Ключевое слово typedef позволяет создать новое имя для существующего типа данных.

В C++ разрешается определять новые имена типов данных с помощью ключевого слова typedef. При использовании typedef-имени новый тип данных не создается, а лишь определяется новое имя для уже существующего типа. Благодаря typedef-именам можно сделать машинозависимые программы более переносимыми: для этого иногда достаточно изменить typedef-инструкции. Это средство также позволяет улучшить читабельность кода, поскольку для стандартных типов данных с его помощью можно использовать описательные имена. Общий формат записи инструкции typedef таков,

typedef тип новое_имя;

Здесь элемент тип означает любой допустимый тип данных, а элемент новое_имя — новое имя для этого типа. При этом заметьте: новое имя определяется вами в качестве дополнения к существующему имени типа, а не для его замены.

Например, с помощью следующей инструкции можно создать новое имя для типа float,

typedef float balance;

Эта инструкция является предписанием компилятору распознавать идентификатор balance как еще одно имя для типа float. После этой инструкции можно создавать float-переменные с использованием имени balance.