|
Программирование >> Формирование пользовательского контейнера
Он обрабатывает оператор 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]);
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |