Виключення в конструкторах та деструкторах

 

Мова 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; просмотров: 1520;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.