Скачиваний:
55
Добавлен:
05.07.2021
Размер:
144.58 Кб
Скачать

3 Индивидуальное задание

Разработать иерархию классов по предметной области (количество классов должно быть не менее пяти), в которой должны быть реализованы следующие связи между классами: агрегация, обобщение. В отчете отобразить созданную диаграмму классов. Сгенерировать минимум пять типов исключительных ситуаций. Реализовать перенаправление исключительных ситуаций. Сгенерировать минимум одну исключительную ситуацию с оператором new. Создать исключительную ситуацию в конструкторе и продемонстрировать вызов конструкторов и деструкторов. Задать собственную функцию завершения. Создать собственный (пользовательский) класс исключения, сгенерировать исключение пользовательского типа и обработать его. Подготовить минимум один вопрос по теме «Обработка исключительных ситуаций в языке С++» и запрограммировать его отображение и фиксацию ответа с выдачей результата.

Программная часть компьютера (установить необходимое программное обеспечение компьютер)

4 Код решения индивидуального задания

#pragma once

#include <iostream>

#include <iomanip>

using namespace std;

template <class T>

class Transaction

{

public:

T* prevState;

T* currentState;

Transaction(T* doc) {

prevState = NULL;

currentState = new T;

currentState = doc;

}

~Transaction() { delete currentState; if (prevState) delete prevState; }

void show()

{

cout << "состояния объекта" << endl;

if (prevState)

{

cout << "prevState = " << endl;

prevState->output();

cout << endl;

cout << "currentState = " << endl;

currentState->output();

cout << endl;

}

else

{

cout << "prevState = NULL" << endl;

cout << "currentState = " << endl;

currentState->output();

cout << endl;

}

}

bool BeginTransactions(T* newState)

{

delete prevState;

prevState = currentState;

currentState = new T(*prevState);

if (!currentState) return 0;

currentState->set(*newState);

return 1;

}

void commit()

{

prevState = NULL;

}

void DeleteTransactions()

{

if (prevState != NULL) {

currentState = NULL;

delete currentState;

currentState = prevState;

prevState = NULL;

}

}

T* operator->() { return currentState; };

};

5 Скриншоты выполнения индивидуального задания

ВЫВОД

В ходе выполнения лабораторной работы была изучены особенности обработки исключительных ситуаций на языке C++. Мы научились использовать операторы THROW, реализация smart-указателей, механизма транзакций и иерархий классов. Работа над лабораторной работой позволила понять смысл утечки памяти, висячей ссылки, идиомы программирования RALL и виды интеллектуальных указателей. Была разработана программа с использованием новых понятий, изученных в лабораторной работе.

Ответы на контрольные вопросы:

1)

2) да

3) Обнаруживающая исключение часть программы использует оператор throw для передачи исключения. Оператор throw состоит из ключевого слова throw, сопровождаемого выражением, которое определяет тип передаваемого исключения. Оператор throw, как правило, завершается точкой с запятой, что делает его выражением.

4) Написание устойчивого к исключениям кода — довольно сложная задача. Важно понимать, что исключения прерывают нормальный поток программы. В месте, где происходит исключение, некоторые из действий, ожидаемых вызывающей стороной, могут быть выполнены, а другие нет. Как правило, пропуск части программы может означать, что объект останется в недопустимом или неполном состоянии, либо что ресурс не будет освобожден и т.д. Программы, которые правильно "очищают" используемые ресурсы во время обработки исключений, называют устойчивыми к исключениям (exception safe).

5) Если программа не может найти подходящий обработчик для сгенерированной исключительной ситуации, то будет вызвана процедура завершения terminate() (ее также называют обработчиком завершения).

6) это будет значить что в коде есть ошибка и выведится сообщение об ошибке

7) просто пропустит?

8) Существует также абсолютный обработчик, который совместим с любым типом исключительной ситуации. Для написания такого обработчика надо вместо его аргументов написать многоточие (эллипсис).catch (...) { //блок обработки исключения }

Так как абсолютный обработчик перехватывает исключительные ситуации любых типов, то он должен стоять в списке обработчиков последним.

10) то никакой инструкции по обработке ошибок выполняться не будет

11)

12)

13)

14)

15)

Соседние файлы в папке лабы Салапура 2ая часть (4 семестр)