Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по Леонову, 5семестр.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
503.3 Кб
Скачать

14. Шаблоны классов.

Шаблон: явл. механизмом параметризации определения класса или ф-ии произвольным типом. Код, реализующий шаблон, идентичен для всех типов параметров. Абстрактн. класс определяет интерфейс. Большая часть кода различных реализаций абстрактного класса может совместно использ-ся в иерархии классов, и большинство фрагментов, использ-щих абстрактный класс, не зависит от его реализации. С т зрения проектирования оба подхода близки. Т. к. оба метода позволяют выразить алгоритм один раз и использовать его со множеством типов, их вместе называют полиморфными. Для того чтобы их различать: то, что обеспечивает ВФ наз. полиморфизмом времени выполнения, а то, что предоставляют шаблоны – полиморфизмом времени компиляции или параметр-им полиморфизмом. Какой метод выбрать? Если между объектами не требуется иерархическая зависимости, лучше использовать их в качестве аргументов шаблонов. Если фактические типы этих объектов не известны во время компиляции, их лучше представлением явл. классы, производные от общего абстрактного класса. Если целью явл. Эфф-ть на этапе выполнения, то есть большое значение имеет встраивание операций, следует использовать шаблоны. Класс или шаблон класса может иметь члены, кот. сами явл-ся шаблонами. Шаблон класса обычно воспринимается как спецификация того, как должны создаваться конкретные типы. Реализация шаблона явл-ся механизмом генерации необходимых типов на основе спецификации пользователя. Поэтому шаблон класса часто называют генератором типов

15. Обработка исключительных ситуаций, структурная обработка исключений.

Понятие исключения (exception) введено для генерации в системе сообщения об ошибке. Идея: ф-я, обнаружившая проблему, кот она не знает, как решать, генерирует (throw) исключение в надежде, что вызывающий модуль знает, что делать в этой ситуации. Ф-я, кот собирается обрабатывать ошибку, может объявить, что она будет перехватывать (catch) исключения данного типа. конструкция catch(/…./){//…..} наз-ся обработчиком исключений. Она может использ-ся только после блока, кот начин-ся со слова try, или сразу после другого обработчика. В скобках нах-ся объявление, кот использ-ся аналогично объявлению аргументов ф-ии. Т.е. оно указывает тип объектов, кот м. б. перехвачены этим обработчиком, и (необязательно) присваивает имена перехватываемым объектам.

Пример с классом vector из стандартной библиотеки, кот. по умолчанию не обеспечивает проверку диапазона:

Void f() { int i=phone_book[1001].number;

//1001-вне предела диапазона /…..}

Такое присваивание поместит в i к-н случайное значение, а не выдаст сообщение об ошибке.

Ф-я at – это операция индексирования вектора (доступ к элементу вектора по индексу), кот генерирует исключения типа out_of_range, если ее аргумент находится вне пределов диапазона вектора. Обращение вне границ диапазона сгенерирует исключение, кот пользователь сможет перехватить.

Одним из способов минимизации сюрпризов от исключений явл использование main() с блоком Try в качестве тела ф-ии:

Int main() try{//код проги}

catch(out_of_range){cerr<<”выход за пределы диапазона \n”; } Catch(…){cerr<<”сгенерировано неизвестное исключение \n;”} ‘это обеспечит обработчик исключений по умолчанию. Значит, если сообщение об исключении не перехвачено, то оно запишется в стандартный поток диагностики ошибок cerr. Если обработчика не нашлось, то возбужд-ся обработчик Enexpected.

Auto_ptr –шаблон <My class> р =new My class //(для динамических объектов):

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

Синтаксис обработчика исключений таков:

__try{//защищенный блок}

__except(фильтр исключений) {//обработчик исключений}

Внутри блока try вып-ся какая-то операция, приводящая к исключению, процессор возбуждает исключение. Тогда ОС ищет начало блока except, и проверяет выражение указанное в качестве фильтра исключения. Если фильтр исключений определен как еxception_execute_handler, то с-ма знает как обработать это исключение: управление передается коду внутри блока except (коду обработчика исключений). После его выполнения с-ма считает исключение обработанным и разрешает проге продолжить работу. Этот механизм позволяет приложениям перехватывать ошибки, обрабатывать их и продолжать выполнение. Если как exeptiom_continue_search, то с-ма должна перейти к предыдущему блоку try, кот. соответ-ет блок except обработать его фильтр, т.е. с-ма должна искать дополнит фильтры исключений, продвигаясь вверх по дереву вызовов, если же все фильтры вернут этот идентификатор, то с-ма получит необработанное исключение; если exeption_continue_executiom: обнаружив такое значение выражения в фильтре, с-ма возвращается к инструкции, вызвавшей исключение и пытается выполнить ее снова.

Примеры предопределенных идентификаторов исключений: 1.исключения связанные с памятью. 2.исключения связанные с обработкой самих исключений (если фильтр исключений вернул непредусмотренное значение); 3. исключения связанные с отладкой; 4. исключения связанные с операциями над целыми числами; 5.исключения связанные с операциями над вещественными числами. Рассмотренные выше исключения относятся к аппаратным, когда поцессор перехватывает события и возбуждает исключения. Существует возможность самостоятельного генерирования исключений, например это делается с пом семейств Heap ф-ий. Они предлагают разработчику возможность выбора, обычно когда их вызовы закан-ся неудачно, они возвращают NULL, сообщая об ошибке. Но возможно передать флаг heap_generate_exceptions. И тогда, при неудачном вызове хип-ф-я не станет возварщать NULL, а вместо этого возбудит программное исключение STATUS_NO_MEMORY.