Программирование >>  Формирование пользовательского контейнера 

1 ... 47 48 49 [ 50 ] 51 52 53 ... 156


Он обрабатывает оператор cases, предоставляющий возможность указать диапазон значений, которые будут обрабатываться одним и тем же фрагмен-том кода. С помощью оператора cases можно записать предыдущий пример следующим образом.

switch(i) { cases 1 to 4:

делать что-нибудь для case-операторов от 1 до 4

break; case 5:

делать что-нибудь еще

break; ...

Таким образом, когда переменная i находится в диапазоне от 1 до 4 включительно, ее значения будут соответствовать оператору cases.

Синтаксическая запись оператора cases выглядит следующим образом:

Cases scart to end;

В данном случае start - первое значение для сопоставления, а end - последнее.

Транслятор преобразует оператор cases в серию стопочных case-операторов.

Оператор typeof

Идентификация типа во время выполнения становится важной составной частью современного программирования. Несмотря на то, что встроенные в язык С++ средства идентификации замечательны, мы, программисты, неутомимый народ, и иногда стараемся улучшить и без того хорошую вешь! Экспериментальный оператор typeof - как раз тот самый случай. Он просто формирует альтернативную синтаксическую конструкцию для операции, которая уже поддерживается в языке С++, - сравнение двух типов. Таким образом, оператор typeof не добавляет новую функциональную возможность, а предлагает другой взгляд на процесс.

Как правило, оператор typeid используется для сравнения типов. Рассмотрим следующий фрагмент, в котором определяется, указывают ли указатели ptri и ptr2 на объекты одного и того же типа: If (typeid(*ptrl) == typeid(*ptr2))

cout ptrl points to same type as ptr2\n В Приведенном примере оператор typeid позволяет получить типы объектов, на которые указывают переменные ptn и ptr2. Если эти типы одиН



С++ 155

,совЫ, выполняется оператор if. Подобный оператор может быть использо-ран при работе, например, с полиморфными классами. В этом случае тип объекта, на который ссылается указатель базового класса, не всегда известен при компиляции и нуждается в проверке во время выполнения приложения. Хотя в операторе type id, как и во всем предыдущем фрагменте, не содер-зийтся ошибки, в следующем фрагменте предложена занятная альтернативная синтаксическая конструкция: If (typeof *ptrl same as *ptr2) cout ptrl points to same type as ptr2\n

В приведенном условном операторе для сравнения типов используется оператор typeof. Результат равен true, если два типа одинаковы, и false - в противном случае. Предложенная версия выполняет ту же операцию, что первоначальная, но сама операция выражена по-другому, что позволяет взглянуть на нее с иной точки зрения.

Далее приведена синтаксическая запись оператора typeof.

Typeof ppl same as op2

opi И op2 задают как идентификатор типа (такой как int или Myciass), так и имя объекта. Таким образом, оператор typeof можно использовать для сравнения типов двух объектов, типа объекта с известным типом данных или двух типов данных.

Транслятор преобразует оператор typeof в соответствующее выражение с оператором type id.

Цикл repeat/until

Как объяснялось ранее, очень легко применить макрос препроцессора для эксперимента с циклом repeat/until. Транслятор реализует его как пример или модель для любого другого типа цикла, с которым вы захотите поэкспериментировать.

Транслятор для экспериментальных конструкций на С++

в Листинге 4.1 приведен полный код транслятора. Для того чтобы им воспользоваться, сохраните код в файле trans.cpp.

jJjCTHHr 4.1. Транслятор для экспериментальных расширений языка С++

♦include <iostream> include <fstream> include <cctype>



#include <cstring> #include <string>

using namespace std;

Прототипы функций, обеспечивающих обработку

ключевых слов расширений.

void foreach();

void cases();

void repeat();

void until();

void typeof(};

Прототипы для разметки (tokenizing) входного файла, bool gettoken(string &tok); void skipspaces ();

Строка-заполнитель для отступов, string indent = ;

Входной и выходной файловые потоки, ifstream fin; ofstream fout;

Класс исключений для синтаксических ошибок, class SyntaxExc {

string what; pxiblic :

SyntaxExc(char *e) { what = string(e); }

string geterrorO { retiom what; }

int main(int argc, char *argv[]) { string token; if(argc != 3) {

cout Usage: ep <input file> <output file>\n

return 1;

fin.open(argv[l]);



1 ... 47 48 49 [ 50 ] 51 52 53 ... 156

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика