Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

13.2.8 Динамічні об’єкти

Якщо виключення викидається з конструктора об’єкта, шо створюється за допомогою операції new, пам’ять автоматично звільняється. Розглянемо наступний прклад:

#include<iostream.h>

class TVClass

{

public:

TVClass()

{

cout<< “TVClass:: TVClass()”<<endl;

throw ”помилка в конструкторі класа TVClass”;

}

~TVClass()

{

cout<<“~ TVClass:: ~TVClass()”<<endl;

}

};

class Tclass: public virtual TVClass

{

int i;

public:

Tclass();

~Tclass();

void*operator new(int size);

void operator delete(void *p);

};

TClass::~TClass()

{cout<<“ TClass::~TClass()”<<end;

}

void*TClass::operator new(size_t size)

{cout<<“TClass::operator new()”<<endl;

return::new char[size];

}

void Tclass::operator delete(void *p)

{

cout<<“TClass::operator delete()”<<endl;

::delete(p);

}

int main(void)

{

Tclass *tcp;

try{

tcp=new Tclass;

cout<<“обєкт створений ”’<<endl;

delete tcp;

}

catch(const char *msg)

{

cout<<“Виключення”<<msg<<endl;

}

return 0;

}

Результати роботи:

Tclass::operator new()

TVClass::TVClass()

Tclass::operator delete()

Виключення: помилка в конструкторі TVClass

13.2.9 Передача значень з конструктора та деструктора

В мові С++ не можна конструктору чи деструктору повертати значення. Однак, можна використовувати виключення для того, щоб повідомити з конструктора чи деструктора про стан помилки. І не тільки про стан помилки: можна повернути цілий обєкт. Приклад:

#include<exept.h>

#include<iostream>

class TSomeClass

{//. . .

public:

struct xSomeClass

{int errCode;

xSomeClass(int err);

{}

};

TSomeClass();

};

TSomeClass::TSomeClass()

{//. . .

if(error_condition)

throw xSomeClass(err_code);

}

int main(void)

{

try

{TSomeClass tsc;

//. . .

}

catch(TsomeClass::xSomeClass xinfo)

{

cout<<“Код помилки виключення:”<<xinfo.errCode<<endl;

}

return 0;

}

13.2.10 Робота з ієрархіями виключень

Як вже відмічалось , можна передбачити обробник для базового класу, який буде перехоплювати будь-які об’єкти, що є public-похідними від базового класу. Утворюючи класи виключень як похідні з загального базового класу, можна використати властивість поліморфізму і перехоплювати вказівник чи посилання на базовий клас. Наприклад, для зображення помилок вводу-виводу можемо використовувати наступні класи:

TIOError

TReadError TSeekError TWriteError

#include<iostream.h>

class TIOError

{

public:

virtual void explain()

{

// ... пояснити проблему

}

};

class TReadError: public TIOError

{ public:

void explain();

// ...

};

class TWriteError: public TIOError

{ public:

void explain();

// ...

};

int main(void){

try{

// виконати ввід.вивід

}

catch(TIOError&ioerr)

{

ioerr.explain();

}

return 0;}