Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

2.4. Исключения 97

Предположим, что функция не содержит спецификацию броска. Это было бы

естественный, чтобы предположить, что такая функция не бросает исключений. Фактически, у этого есть совершенно другое значение. Если функция не обеспечивает спецификацию броска, то она может бросить любое исключение. Хотя это запутывающее, необходимо поддержать совместимость с более старыми версиями C ++. Чтобы указать, что функция не бросает исключений, предоставьте спецификатору броска пустой список исключений.

пустота func1 (); //может бросить любую пустоту исключения func2 () бросок (); //не может бросить исключения

Универсальный класс исключения

Мы объявляем много различных исключений в этой книге. Чтобы структурировать их экс-

ceptions иерархически, у нас должен быть один универсальный класс исключения, который служит «матерью всех исключений». C ++ не обеспечивает такое универсальное исключение, таким образом, мы создали одно собственное. Этот класс, названный RuntimeException, показывают ниже. У этого есть сообщение об ошибке как его единственный участник. Это предоставляет конструктору, которому дают информативное сообщение об ошибке как его аргумент. Это также обеспечивает членскую функцию getMessage, который позволяет нам получать доступ к этому сообщению.

класс RuntimeException

частный:

последовательность errorMsg; общественность:

//универсальное исключение во время выполнения

RuntimeException (константа string& допускают ошибку)errorMsg = допускают ошибку;

натяните getMessage (), константавозвращает errorMsg;

;

Получая все наши исключения из этого базового класса, для любого исключения e, мы можем произвести сообщение об ошибке e, призвав унаследованную функцию getMessage.

98 Глава 2. Ориентированный на объект дизайн

2.5

Упражнения

Для помощи с упражнениями, пожалуйста, посетите веб-сайт, www.wiley.com/college/goodrich. <www.wiley.com/college/goodrich>

Укрепление

R-2.1 Что является некоторыми потенциальными недостатками эффективности наличия очень глубоко в -

деревья heritance, то есть, большой набор классов, A, B, C, и так далее, такой, что B расширяет A, C, расширяют B, D расширяет C и т.д.?

R-2.2 Что является некоторыми потенциальными недостатками эффективности наличия очень мелкого

деревья наследования, то есть, большой набор классов, A, B, C, и так далее, такой, что все эти классы расширяют единый класс, Z?

R-2.3 Дайте три примера критических по отношению к жизни приложений. R-2.4 Дайте пример приложения, где адаптируемость может означать

различие между длительной целой жизнью продаж и банкротством.

R-2.5 Опишите компонент от редактора текста GUI (кроме «отредактировать» меню)

и членские функции, которые это заключает в капсулу.

R-2.6 Потяните диаграмму наследования класса для следующего набора классов.

• Коза класса расширяет Объект и добавляет членский хвост переменной и

молоко функций и скачок.

• Свинья класса расширяет Объект и добавляет членский нос переменной и func-

tions едят и валяются.

• Лошадь класса расширяет Объект и добавляет членскую высоту переменных и

цвет и функции бегут и подскакивают.

• Гонщик класса расширяет Лошадь и добавляет гонку функции.

• Всадник класса расширяет Лошадь и добавляет членский вес переменной

и бег функций и isTrained.

R-2.7 Конструктор производного класса явно призывает конструктора его базового класса,

но печь для сжигания отходов производства производного класса не может призвать печь для сжигания отходов производства своего базового класса. Почему эта очевидная асимметрия имеет смысл?

R-2.8 Дайте короткий фрагмент C ++ кодекс, который использует классы прогрессии от