- •Шаблони класів
- •Конкретизація шаблону класу
- •Спеціалізація шаблонів класів
- •Статичні члени шаблонного классу
- •Ключове слово typename
- •Недоліки шаблонів
- •Обробка виняткових ситуацій
- •Генерування винятків
- •Завдання до лабораторної роботи № 3
- •Перехоплювання винятків
- •Об’єктно-орієнтоване програмування методичні вказівки
Перехоплювання винятків
Якщо при роботі програми в певній точці викидається виняток, потік виконання програми переривається і виходить наступне:
якщо викинута змінна вбудованого типу або об’єкт класу за значенням, створюється копія викинутої змінної (причому в останньому випадку використовується конструктор копіювання); якщо викинута змінна по посиланню, копіювання не відбувається;
здійснюється пошук найближчого обробника, який приймає параметр, сумісний з типом викинутої змінної;
якщо обробник знайдено, стек розкручується до цієї точки; при цьому викликаються деструктори локальних об’єктів, які виходять з області видимості;
управління програмою передається знайденому обробнику;
якщо обробник не знайдений, ви можете викликати set__terminate (), надавши обробник завершення; в іншому випадку програма викликає функцію завершення.
Якщо виняток не викинуто, програма виконується звичайним чином.
При пошуку відповідного типу винятку компілятор користується такими
правилами. Оброблювач вважається знайденим, якщо:
тип викинутої змінної співпадає з типом, очікуваним обробником; іншими словами, якщо тип викинутої змінної Т, відповідними йому визнаються обробники, що перехоплюють виключення типу Т, const Т, Т& і constТ&;
тип викинутої змінної є вказівником, тип якого може бути перетворений до типу вказівника, які перехоплюються обробником;
викинута змінна є об’єктом деякого класу, а тип перехоплених винятків є базовим класом, успадкованим цим об’єктом як public.
Ще раз підкреслимо, що компілятор шукає найближчого обробника, який приймає параметр, сумісний з типом викинутої змінної. Цей момент не слід забувати і уважно стежити за порядком, в якому розташовуються в програмі обробники винятків для даного try-блоку. Оброблювач, що очікує виняток базового класу, приховує обробник похідного класу. Точно так само обробник для вказівника типу void* приховує обробник для вказівника будь-якого типу. Розглянемо приклад:
#іnclude <iostream.h>
class Base
{
};
class Derived: public Base
{
};
void FuncExDerived ()
{
Derived derOb;
throw derOb;
}
void FuncExErr()
{
throw "Помилка у функції FuncExErr ()";
}
int main()
{
try
{
FuncExDerived();
}
catch (Derived&)
{
cout << "Виняток перехоплено" << "в Derived&" << endl;
}
/ / Цей обробник може приховувати попередній,
/ / якщо буде розміщений перед ним.
catch(Base&)
{
cout <<" Виняток перехоплено "<" в Base & "<< endl;
}
try
{
FuncExErr ();
}
catch (const char*)
{
cout << "Виняток перехоплено" << "в const char*" << endl;
}
/ / Цей обробник може приховувати
/ / попередній, якщо буде розміщений перед ним.
catch (void*)
{
cout << "Виняток перехоплено " << "в void*" << endl;
}
return 0;
}
При виконанні програма виводить на екран:
Виняток перехоплено в Derived&
Виняток перехоплено в const char*
Якщо переставити місцями обробники переривання, результат буде зовсім іншим.
Завдання до лабораторної роботи № 3
Загальні вказівки для всіх варіантів
У всіх варіантах потрібно створити шаблон деякого цільового класу А, можливо, реалізований із застосуванням деякого серверного класу В. Це означає, що об’єкт класу В використовується як елемент класу А. В якості серверного класу може бути вказаний або клас, створений програмістом або клас зі стандартної бібліотеки – наприклад, std:. vector.
Варіанти цільових або серверних класів, які створюються програмістом, наведені в табл. 1.
Таблиця 1
Варіанти цільових або серверних класів
Ім'я класу |
Призначення |
Vect |
одновимірний динамічний масив |
List |
двонаправлений список |
Stack |
стек |
В1пагуТгее |
бінарне дерево |
Queue |
одностороння черга |
Deque |
двостороння черга (допускає вставку і видалення з обох кінців черги) |
Set |
множина (елементи, які повторюються, в множину не заносяться; елементи в множині зберігаються відсортованими) |
SparseArray |
розріджений масив |
Якщо замість серверного класу вказаний динамічний масив, то це означає, що для зберігання елементів контейнерного класу використовується масив, що розміщується за допомогою операції new.
У всіх варіантах необхідно передбачити генерацію і обробку винятків для можливих помилкових ситуацій.
У всіх варіантах показати в клієнті main() використання створеного класу, який містить ситуації, що призводять до генерації винятків. Показати генерацію шаблону для типів int, double, std :: string.
Варіанти завдань наведені в табл. 2.
Таблиця 2
Варіанти завдань
Варіант |
Цільовий шаблонний клас |
Реалізація з використанням |
1 |
Vect |
std: :list |
2 |
List |
– |
3 |
Stack |
Динамічний массив |
4 |
Stack |
Vect |
5 |
Stack |
List |
6 |
Stack |
Std::vector |
7 |
Stack |
std::list |
8 |
BinaryTree |
– |
9 |
Queue |
Vect |
10 |
Queue |
List |
11 |
Queue |
Std::list |
12 |
Deque |
Vect |
13 |
Deque |
List |
14 |
Deque |
Std::list |
15 |
Set |
Динамічний масив |
16 |
Set |
Vect |
17 |
Set |
List |
18 |
Set |
Std::vector |
19 |
Set |
Std::list |
20 |
SparseArray |
list |
Література
Т.А.Павловская. С/С++. Программирование на языке высокого уровня. – СПб., 2008.
В.В.Лаптев. С++. Объектно-ориентированное программирование. – СПб., 2008.
А. Пол. Объектно-ориентированное программирование на С++. - М., 2001.
У.Савитч. Язык С++. Курс объектно-ориентированного программирования. Пер. С англ. – М., 2001.
Б. Страуструп. Язык программирования С++. - СПб., 1999.
С.В.Глушаков, А.В.Коваль, С.В.Смирнов. Язык программирования С++. - Харьков, 2002.
Г. Шилдт. Теория и практика С++. – М., 2001.
С. Прата. Язык программирования С++. – М.-СПб.- К., 2003.
У. Топп. Структуры данных в С++. – М., 2000.
Г.Буч. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. - М., 1999.
Т. Бадд. Объектно-ориентированное программирование в действии. - СПб., 2001.
Р. Лафоре. Объектно-ориентированное программирование в С++. - СПб., 2003.
Д. Лукас. С++ под рукой. – М., 1999.
Х. Дейтел. Как программировать на С++. – М., 2001.
В.Войтенко, А.Морозов. С/С++: Теорія та практика. Навч.-метод. посібник. – Житомир, 2004.
Т.А.Павловская, Ю.А.Щупак. С++. Объектно-ориентированное программирование: Практикум. – СПб., 2004.
В.В.Лаптев, А.В.Морозов, А.В.Бокова. С++. Объектно-ориентированное программирование. Задачи и упражнения. – СПб., 2007.
НАВЧАЛЬНЕ ВИДАННЯ
