|
|||
Работа № 7. Множественное наследование с использованием абстрактных базовых классов, файлового ввода-вывода с применением потоков С++, функций обработки исключительных ситуаций⇐ ПредыдущаяСтр 11 из 11 Задание к работе Общая постановка. Дано: число N и последовательность a1, a2, … aN
Варианты заданий 1. a1, (a1+a2), …, (a1+a2+…+aN); 2. (a1*a1), (a1*a2), …, (a1*aN); 3. |a1|, |a1+a2|, …, |a1+a2+…aN|; 4. a1, -a1*a2, +a1*a2*a3, …, (-1)N*a1*a2*…aN; 5. -a1, +a2, -a3, …, (-1)N*aN; 6. (a1+1), (a2+2), (a3+3), …, (aN+N); 7. a1*1, a2*2, a3*3, , aN*N; 8. a1*a2, a2*a3, …, (aN-1)*aN; 9. a1/1, a2/2, a3/3, …, aN/N; 10. (a1+a2), (a2+a3), …, (aN-1+aN); 11. (a1+a2+a3), (a2+a3+a4), (a3+a4+a5), … (aN-2+aN-1+aN); 12. (N+a1), ( N-1+a2), , (1+aN); 13. (N*a1), ( (N-1)*a2), , (1*aN); 14. a1/N, a2/N-1, …, aN/1.
Контрольные вопросы 1. С какой целью используются шаблоны классов? 2. Какие существуют виды параметров шаблона класса? 3. В чем заключается особенность использования функций – методов шаблона? 4. Может ли использоваться шаблон для параметризированных объектов?
Работа № 7. Множественное наследование с использованием абстрактных базовых классов, файлового ввода-вывода с применением потоков С++, функций обработки исключительных ситуаций
Теоретические сведения Задание к работе Варианты заданий Контрольные вопросы
Цель работы – изучить методику создания множественного наследования, использование абстрактного базового класса, файловый ввод – вывод и использование функций обработки исключительных ситуаций.
Теоретические сведения Абстрактные классы Если базовый класс используется только для порождения производных классов, то виртуальные функции в базовом классе могут быть " пустыми", поскольку никогда не будут вызваны для объекта базового класса. Базовый класс в котором есть хотя бы одна такая функция, называется абстрактным. Виртуальные функции в определении класса обозначаются следующим образом: class base
class d: public a, public b, public c { };
Такое действие выполняется компилятором как явно при преобразовании в программе типов указателей, так и неявно, когда в объекте производного класса наследуется функция из второго и последующих базовых классов. Для вышеуказанного примера при определении в классе bb функции f() и ее наследовании в классе " d" вызов D1. f() будет реализован следующим образом:
this = & D1; // Указатель на объект производного класса Механизм виртуальных функций при множественном наследовании имеет свои особенности. Во-первых, на каждый базовый класс в производном классе создается свой массив виртуальных функций (в нашем случае -для aa в d, для bb в d и для cc в d). Во-вторых, если функция базового класса переопределена в производном, то при ее вызове требуется преобразовать указатель на объект базового класса в указатель на объект производного. Для этого транслятор включает соответствующий код, корректирующий значение this в виде " заплаты", передающей управление командой перехода к переопределяемой функции, либо создает отдельные таблицы смещений. Файловые потоки. Классы файловых потоков: ifstream - файл ввода, производный от istream ofstream - файл вывода, производный от ostream fstream - файл ввода-вывода, производный от iostream Флаги режимов работы с файлом: enum ios:: open_mode
ifstream(); // Без открытия файлов ifstream(int fd); // С присоединенем файла с дескрип- ifstream( // То же, с явно заданным буфером void ifstream:: open( void close(); // Закрыть файл Унаследованные переопределения операторов позволяют проверять наличие ошибок в потоках в виде: fstream ss; if (ss)... или if (! ss)...
Обработка исключительных ситуаций Средства обработки ошибочных ситуаций позволяют передать обработку исключений из кода, в котором возникло исключение, некоторому другому программному блоку, который выполнит в данном случае некоторые определенные действия. Таким образом, основная идея данного механизма состоит в том, что функция проекта, которая обнаружила непредвиденную ошибочную ситуацию, которую она не знает, как решить, генерирует сообщение об этом (бросок исключения). А система вызывает по этому сообщению программный модуль, который перехватит исключение и отреагирует на возникшее нештатное событие. Такой программный модуль называют «обработчик» или перехватчик исключительных ситуаций. И в случае возникновения исключения в его обработчик передаётся произвольное количество информации с контролем ее типа. Эта информация и является характеристикой возникшей нештатной ситуации. Обработка исключений в С++ это обработка с завершением. Это означает, что исключается невозможность возобновления выполнения программы в точке возникновения исключения. Для обеспечения работы такого механизма были введены следующие ключевые слова: try - проба испытания; catch - перехватить (обработать); throw - бросать. Кратко рассмотрим их назначение. try - открывает блок кода, в котором может произойти ошибка; это обычный составной оператор:
Код содержит набор операций и операторов, который и будет контролироваться на возникновение ошибки. В него могут входить вызовы функции пользователя, которые компилятор так же возьмет на контроль. Среди данного набора операторов и операций обязательно указывают операцию броска исключения: throw. Операция броска throw имеет следующий формат: throw выражение; где - «выражение» определяет тип информации, которая и описывает исключение (например, конкретные типы данных). catch - сам обработчик исключения, который перехватывает информацию:
Через параметр обработчику передаются данные определенного типа, описывающие обрабатываемое исключение. Код определяет те действия, которые надо выполнить при возникновении данной конкретной ситуации. В С++ используют несколько форм обработчиков. Такой обработчик получил название параметризованный специализированный перехватчик Перехватчик должен следовать сразу же после блока контроля, т. е. между обработчиком и блоком контроля не должно быть ни одного оператора. При этом в одном блоке контроля можно вызывать исключения разных типов для разных ситуаций, поэтому обработчиков может быть несколько. В этом случае их необходимо расположить сразу же за контролирующим блоком последовательно друг за другом. Кроме того, запрещены переходы, как извне в обработчик, так и между обработчиками. Можно воспользоваться универсальным или абсолютным обработчиком:
где (... ) - означают способность данного перехватчика обрабатывать информацию любого типа. Такой обработчик располагают последним в пакете специализированных обработчиков. Тогда, если исключение не будет перехвачено специализированными обработчиками, то буде выполнен последний - универсальный. В случае не возникновения исключения, набор обработчиков будет обойден, т. е. проигнорирован. Если же исключение было брошено, при возникновении критической ситуации, то будет вызван конкретный перехватчик при совпадении его параметра с выражением в операторе броска, т. е. управление будет передано найденному обработчику. После выполнения кода вызванного обработчика, управление передается оператору, который расположенный за последним перехватчиком, или проект корректно завершает работу. Существенное отличие вызова конкретного обработчика от вызова обычной функции заключается в следующем: при возникновении исключения и передаче управления определенному обработчику, система осуществляет вызов всех деструкторов для всех объектов классов, которые были созданы с момента начала контроля и до возникновения исключительной ситуации с целью их уничтожения. Блоки try, как составные блоки могут быть вложены:
Задание к работе Общая постановка. Создать программу с абстрактным базовым классом и множественным наследованием, реализовать в нем: · конструктор, · деструктор, · виртуальную функцию просмотра текущего состояния объекта print(), · friend, · функцию Run (). Производные классы должны содержать переопределенную функцию просмотра состояния объектов (print()). Используя стандартные файловые потоки, информацию об объектах вывести в файл. При вводе - выводе данных обработка ошибочных ситуаций (например, невозможность открыть файл или нехватка места на диске) должно обрабатываться с использованием механизма исключений.
Варианты заданий 1. Книги 2. Транспорт 3. Продовольственные товары 4. Студенты 5. Объекты недвижимости 6. Спортсмены 7. Периодические издания 8. Отдел кадров 9. Научно-исследовательские разработки 10. Программное обеспечение 11. Комплектующие ЭВМ 12. Перевозки 13. Аудио-студия 14. Мобильные телефоны 15. Сетевое оборудование
Контрольные вопросы 1. Что такое множественное наследование? 2. Как объявляются виртуальные функции в абстрактном базовом классе? 3. Поясните механизм виртуальных функций при множественном наследовании. 4. Какие вы знаете функции обработки исключительных ситуаций (пояснить особенности каждой)?
|
|||
|