Глава 10. Объектно-ориентированное программирование
{
public :
u n d e r f l o w ( ) ;
} ;
u n d e r f l o w : : u n d e r f l o w ( ) : g e n e r a l _ e r r o r ( "Массив пуст" ) {}
c l a s s a r r a y
{
s i z e _ t s i z e ;
//реальный размер массива
s i z e _ t c a p a c i t y ; //максимально-допустимый размер
double ∗ data ;
public :
a r r a y ( s i z e _ t c a p a c i t y ) throw ( g e n e r a l _ e r r o r ) ;
~ a r r a y ( ) ;
double operator [ ] ( s i z e _ t i ) throw ( out_of_range ) ; //получить значение i-го
элемента
void push ( double v ) throw ( o v e r f l o w ) ; //добавить элемент
double pop ( ) throw ( u n d e r f l o w ) ; //убрать последний добавленный элемент
} ;
a r r a y : : a r r a y ( s i z e _ t c a p a c i t y ) throw ( g e n e r a l _ e r r o r )
{
i f ( c a p a c i t y ==0) throw
g e n e r a l _ e r r o r ( "массив нулевой вместимости" ) ;
this
−>c a p a c i t y=c a p a c i t y ;
s i z e =0;
data = new double [ c a p a c i t y ] ;
}
a r r a y : : ~ a r r a y ( ) {
delete [ ] data ;
}
double a r r a y : : operator [ ] ( s i z e _ t i ) throw ( out_of_range )
{
i f ( i < s i z e ) return data [ i ] ;
e l s e throw out_of_range ( i ) ;
}
void a r r a y : : push ( double v ) throw ( o v e r f l o w )
{
i f ( s i z e < c a p a c i t y ) data [ s i z e ++]=v ;
e l s e throw o v e r f l o w ( ) ;
}
double a r r a y : : pop ( ) throw ( u n d e r f l o w )
{
i f ( s i z e > 0 ) return data[
−− s i z e ] ;
e l s e throw u n d e r f l o w ( ) ;
}
void main_loop ( a r r a y& a )
{
char c ;
double v ;
s i z e _ t i ;
f o r ( ; ; )
{
c o u t << "Введите \ " + \ " для добавления элемента, "
" \ " - \ " для извлечения , \ " i \ " для просмотра "
" i-го элемента , \ " a \ " для выхода: "
;
c i n >> c ;
try {
switch ( c ) {
case ’ + ’ :
c o u t << "Введите добавляемое число: " ;
c i n >> v ;
a . push ( v ) ;
break ;
case ’ - ’ :
v=a . pop ( ) ;
c o u t << "Извлечено число " << v << e n d l ;
Программирование на языке С++ в среде Qt Creator
10.5. Обработка исключений
313
break ;
case ’ i ’ :
c o u t << "Введите индекс: " ;
c i n >> i ;
v=a [ i ] ;
c o u t << "Искомый элемент равен " << v << e n d l ;
break ;
case ’ a ’ :
return ;
break ;
}
}
catch ( out_of_range& e )
{
out << "Попытка доступа к элементу с недопустимым индексом " << e . i << e n d l ;
throw ;
}
catch ( o v e r f l o w )
{
cout<<"Операция не выполнена, так как массив переполнен\ n " ;
}
catch ( u n d e r f l o w ) {
c o u t << "Операция не выполнена, так как массив пуст\ n " ;
}
}
}
main ( )
{
double v ;
try
{
c o u t << "Введите ёмкость массива: " ;
c i n >> v ;
a r r a y a ( v ) ;
main_loop ( a ) ;
}
catch ( g e n e r a l _ e r r o r& e )
{
c o u t << "Произошла неустранимая ошибка следующего типа: " << e . message << e n d l ;
}
}
10.5.4
Спецификация исключений
Если некоторая функция содержит инструкции throw, в её заголовке можно
явно прописать, какие исключения она может генерировать:
void f() throw (x,y,z);
В примере функция f() может генерировать исключения с классами-
индикаторами x, y, z (и производными от них). Если заголовок описан как
«void f() throw ()» — функция не генерирует исключений вообще. И, наконец,
если в заголовке функции ничего не указано, она может генерировать любые ис-
ключения (без этого последнего правила не смогли бы работать программы, не
использующие обработку исключений).
Если функция попытается сгенерировать исключение, отсутствующее в её
списке — вызовется специальная функция void unexpected(), которая в свою
очередь вызовет фунцкию void terminate(), а та вызовет функцию abort(),
аварийно завершающую программу. Программист имеет возможность заменить
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
314
Do'stlaringiz bilan baham: |