С++ для начинающих




Перечисления - часть 2


// ...

om = append;

open_file( "TailTell", om );

Однако получить имена таких элементов невозможно. Если мы напишем оператор вывода:

cout << input << " " << om << endl;

то все равно получим:

1 3

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

cout << open_modes_table[ input ] << " "

           << open_modes_table[ om ]    << endl

Будет выведено:

input append

Кроме того, нельзя перебрать все значения перечисления:

// не поддерживается

for ( open_modes iter = input; iter != append; ++inter )

// ...

Для определения перечисления служит ключевое слово enum, а имена элементов задаются в фигурных скобках, через запятую. По умолчанию первый из них равен 0, следующий – 1 и так далее. С помощью оператора присваивания это правило можно изменить. При этом каждый следующий элемент без явно указанного значения будет на 1 больше, чем элемент, идущий перед ним в списке. В нашем примере мы явно указали значение 1 для input, при этом output и append будут равны 2 и 3. Вот еще один пример:

// shape == 0, sphere == 1, cylinder == 2, polygon == 3

enum Forms{ share, spere, cylinder, polygon };

Целые значения, соответствующие разным элементам одного перечисления, не обязаны отличаться. Например:

// point2d == 2, point2w == 3, point3d == 3, point3w == 4

enum Points { point2d=2, point2w, point3d=3, point3w=4 };

Объект, тип которого – перечисление, можно определять, использовать в выражениях и передавать в функцию как аргумент. Подобный объект инициализируется только значением одного из элементов перечисления, и только такое значение ему присваивается – явно или как значение другого объекта того же типа. Даже соответствующие допустимым элементам перечисления целые значения не могут быть ему присвоены:

void mumble() {

    Points pt3d = point3d; // правильно: pt2d == 3

    // ошибка: pt3w инициализируется типом int

    Points pt3w = 3;

    // ошибка: polygon не входит в перечисление Points

    pt3w = polygon;

    // правильно: оба объекта типа Points

    pt3w = pt3d;

}

Однако в арифметических выражениях перечисление может быть автоматически преобразовано в тип int. Например:

const int array_size = 1024;

// правильно: pt2w преобразуется int

int chunk_size = array_size * pt2w;




Содержание  Назад  Вперед