Виключення в конструкторах та деструкторах
Мова C++ не дозволяє повертати значення з конструктора і деструктора. Механізм виключень дає можливість повідомити про помилку, що виникла в конструкторі або деструкторі об'єкту. Для цього створимо клас Vector, в якому обмежується кількість запрошуваної пам'яті:
Class Vector
{
public:
class Size{}; // Клас виключення
enum {max = 32000}; // Максимальна довжина вектору
Vector(int n) // Конструктор
{
if (n < 0 || n > max) throw Size(); ... }
...
}
При використанні класу Vector можна передбачити перехоплення виключень типу Size:
Try
{
Vector *р = new Vector(i);
...
}
catch(Vector::Size)
{
... // Обробка помилки розміру вектора
}
У обробнику може використовуватися стандартний набір основних способів видачі повідомлень про помилку і відновлення. Усередині класу, що визначає виключення, може зберігатися інформація про виключення, яка передається обробникові. Сенс цієї техніки полягає в тому, щоб забезпечити передачу інформації про помилку з точки її виявлення в місце, де для обробки помилки є достатньо можливостей.
Якщо в конструкторі об'єкту генерується виключення, автоматично викликаються деструктори для повністю створених в цьому блоці до теперішнього моменту об'єктів, а також для полів даних поточного об'єкту, що є об'єктами, і для його базових класів. Наприклад, якщо виключення виникло при створенні масиву об'єктів, деструктори будуть викликані тільки для успішно створених елементів.
Якщо об'єкт створюється в динамічній пам'яті за допомогою операції new і в конструкторі виникне виключення, пам'ять з-під об'єкту коректно звільняється.
6.6 Ієрархії виключень
Використання власних класів виключень переважніше застосування стандартних типів даних. За допомогою класів можна гнучкіше організувати передачу інформації про виключення, легко диференціювати обробку виключень, а крім того, з'являється можливість використовувати ієрархії класів.
Оскільки механізм управління виключеннями дозволяє створити обробник для базового класу, споріднені виключення часто можна представити у вигляді ієрархії. Проводячи виключення від загального базового класу, можна в обробнику перехоплювати посилання або вказівку на базовий клас, використовуючи поліморфізм. Наприклад, в математичній бібліотеці можна організувати класи таким чином:
class Matherr{}:
class Overflow: public Matherr{}; // Переповнення
class Underflow: public Matherr{}; // Зникнення порядку
class ZeroDivide: public Matherr{}; // Ділення на нуль
Для представлення помилок введення/виведення можуть використовуватися наступні класи:
class IOerr{}:
class Readerr: public IOerr{}; // Помилка читання
class Writerr: public IOerr{}; // Помилка запису
class Seekerr: public IOerr{}; // Помилка пошуку
Залежно від обставин можна використовувати або обробник виключень базового класу, який перехоплюватиме і похідні виключення, або власні обробники похідних класів.
Існує ряд стандартних виключень, які генеруються операціями або функціями C++. Всі вони є похідними від бібліотечного класу exception, описаного в заголовному файлі <stdexcept>. Наприклад, операція new при невдалому виділенні пам'яті генерує виключення типу bad_alloc.
Програміст може визначити власні виключення, похідні від стандартних [1].
Завдання
Завдання отримуються з розділу 3 "Спадкування класів" та доповнюються обробкою виключних ситуацій.
РОЗДІЛ 7. РЯДКИ
7.1 Рядки в стилі С++
С++ не містить стандартного типу даних "рядок". Замість цього він підтримує масиви символів, що завершуються нуль-символом. Бібліотека містить функції для роботи з такими масивами, успадковані від C і описані в заголовному файлі <string.h> (<cstring>). Вони дозволяють досягти високої ефективності, але дуже незручні і небезпечні у використанні, оскільки вихід за межі рядка не перевіряється. Для нового стандарту C++ розроблена стандартна бібліотека роботи з типом даних string, який позбавлений цих недоліків. Основні дії з рядками виконуються за допомогою операцій і методів, а довжина рядка змінюється динамічно відповідно до потреб. Для використання класу необхідно підключити до програми заголовний файл <string>. Порівняльний аналіз старого і нового стилю роботи з рядками розглянемо на прикладі:
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
Дата добавления: 2014-12-26; просмотров: 1524;