Бьерн Страуструп. Язык программирования С++ Второе дополненное издание



Pdf көрінісі
бет170/256
Дата11.07.2022
өлшемі2,87 Mb.
#37591
1   ...   166   167   168   169   170   171   172   173   ...   256
Байланысты:
Бьерн Страуструп. Язык программирования С . М Бином, 2011

9.3 Имена особых ситуаций 
Особая ситуация перехватывается благодаря своему типу. Однако, запускается ведь не тип, а объект. 
Если нам нужно передать некоторую информацию из точки запуска в обработчик, то для этого ее 
следует поместить в запускаемый объект. Например, допустим нужно знать значение индекса, 
выходящее за границы диапазона: 
class Vector { 
public: 
class 
Range 

public: 
int 
index; 
Range(int i) : index(i) { } 
}; 
// 
... 
int& 
operator[](int 
i) 
}; 
int Vector::operator[](int i) 

if (o<=i && i throw 
Range(i); 

Чтобы исследовать недопустимое значение индекса, в обработчике нужно дать имя объекту, 
представляющему особую ситуацию: 
void f(Vector& v) 

// 
... 
try 

do_something(v); 

catch (Vector::Range r ) { 
cerr << "недопустимый индекс" << r.index << '\n'; 
// 
... 



Бьерн Страуструп.
Язык программирования С++ 
 
238 
// 
... 

Конструкция в скобках после служебного слова catch является по сути описанием и она аналогична 
описанию формального параметра функции. В ней указывается каким может быть тип параметра (т.е. 
особой ситуации) и может задаваться имя для фактической, т.е. запущенной, особой ситуации. 
Вспомним, что в шаблонах типов у нас был выбор для именования особых ситуаций. В каждом 
созданном по шаблону классе был свой класс особой ситуации: 
template class Allocator { 
// 
... 
class Exhausted { } 
// 
... 
T* 
get(); 
}; 
void f(Allocator& ai, Allocator& ad) 

try 

// 
... 

catch (Allocator::Exhausted) { 
// 
... 

catch (Allocator::Exhausted) { 
// 
... 


С другой стороны, особая ситуация может быть общей для всех созданных по шаблону классов: 
class Allocator_Exhausted { }; 
template class Allocator { 
// 
... 
T* 
get(); 
}; 
void f(Allocator& ai, Allocator& ad) 

try 

// 
... 

catch (Allocator_Exhausted) { 
// 
... 


Какой способ задания особой ситуации предпочтительней, сказать трудно. Выбор зависит от 
назначения рассматриваемого шаблона. 


Достарыңызбен бөлісу:
1   ...   166   167   168   169   170   171   172   173   ...   256




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет