ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4260
Скачиваний: 28
Часть IV. Стандартная библиотека языка программирования С++
416
Как видим, все члены класса
out_of_range
наследуются от класса
logic_error
, который в свою очередь наследует все свои члены от
класса
exception
. Единственным параметром конструктора явля-
ется объект типа
string
, который содержит описание исключе-
ния. Этот объект и возвращает функция
what
, которая наследует-
ся классом
out_of_range
от класса
exception
через класс
logic_error
.
Тип
string
является классом, который служит для представления
строк языка программирования С++. Этот класс описан в
гл. 39
.
Кроме того, заметим, что стандартные исключения можно также
генерировать и в пользовательских функциях. Но при этом не
нужно противоречить назначению стандартных исключений.
Иначе возможны недоразумения у других пользователей этой
функции.
В листинге 37.1 приведен пример обработки стандартного ис-
ключения, которое генерирует оператор индексирования, пере-
груженный как член контейнерного класса
bitset
, предназначен-
ного для хранения массива бит и определенного в стандартной
библиотеке языка программирования С++.
Листинг 37.1. Обработка стандартного исключения
#include <iostream>
#include <bitset>
#include <stdexcept>
using namespace std;
int main()
{
const bitset<8> x(0xFF);
try
{
bool y = x[10]; // выход индекса за границы
}
catch (out_of_range& e)
{
Глава 37. Классы стандартных исключений <stdexcept>
417
cout << e.what() << endl; // invalid bitset<N> position
}
cout << "Press any key to exit." << endl;
cin.get();
return 0;
}
Г Л А В А
38
Динамическая
идентификация типов
<typeinfo>
38.1. Динамическая
идентификация типов
Под динамической идентификацией типов (RTTI, Run-Time Type
Identification) понимают определение типа объекта, на который
ссылается ссылка или указывает указатель, во время исполнения
программы. Если тип ссылки или указателя полиморфный, то ди-
намическая идентификация типов позволяет определить тип ре-
ального объекта, на который ссылается эта ссылка или указывает
указатель, во время исполнения программы. Если же тип ссылки
или указателя не является полиморфным, то определение типа
объекта выполняется статически во время компиляции про-
граммы.
Для поддержки динамической идентификации и преобразования
типов объектов в заголовочном файле typeinfo определены сле-
дующие классы:
namespace std
{
class type_info;
class bad_cast;
class bad_typeid;
}
Глава 38. Динамическая идентификация типов <typeinfo>
419
Назначение этих классов описано в следующих разделах данной
главы.
В заключение этого раздела заметим, что не все компиляторы
поддерживают динамическую идентификацию типов по умол-
чанию.
38.2. Класс
type_info
Класс
type_info
содержит описания типов, определенных в про-
грамме. Объекты этого класса хранят указатель на имя типа и
код, который позволяет сравнивать типы на равенство и сортиро-
вать типы в соответствии с заданным порядком сортировки сим-
волов (collation order).
Класс
type_info
имеет следующий интерфейс:
namespace std
{
class type_info
{
private:
type_info(const type_info&
rhs
);
type_info& operator=(const type_info&
rhs
);
public:
virtual ~type_info();
bool operator==(const type_info&
rhs
) const;
bool operator!=(const type_info&
rhs
) const;
bool before(const type_info&
rhs
) const;
const char* name() const;
};
}
Из этого интерфейса видно, что в программе пользователя невоз-
можно создать объект типа
type_info
, так как этот класс не имеет
конструкторов в разделе
public
. Объект этого класса может быть
создан только оператором
typeid
, который рассмотрен в следую-
щем разделе.
Часть IV. Стандартная библиотека языка программирования С++
420
Объекты класса
type_info
можно сравнивать на равенство или
неравенство, используя перегруженные операторы члены класса
==
или
!=
соответственно.
Метод
before
позволяет сравнивать типы в соответствии с задан-
ным порядком сортировки символов (collation order). Если объ-
ект, на который указывает указатель
this
, предшествует объекту,
заданному параметром
rhs
, то метод
before
возвращает значение
true
, в противном случае —
false
.
Метод
name
возвращает указатель на строку языка программиро-
вания С, которая описывает тип.
38.3. Оператор
typeid
Для динамической идентификации типа объекта в языке про-
граммирования C++ предназначен оператор
typeid
, который име-
ет следующий вид:
typeid(выражение|имя_типа)
Оператор
typeid
возвращает константный объект класса
type_info
, который содержит информацию о типе параметра опе-
ратора
typeid
. Поэтому при использовании оператора
typeid
в
программу нужно включить заголовочный файл typeinfo.
Работает оператор
typeid
следующим образом:
если операндом оператора
typeid
является L-value, тип кото-
рого является полиморфным классом, то оператор определяет
динамический тип операнда, учитывая, что операнд может
быть наследником полиморфного класса;
если операндом оператора
typeid
не является L-value, то опе-
ратор определяет статический тип операнда, то есть наследо-
вание полиморфных классов не принимается во внимание;
если операндом оператора
typeid
является имя типа, то опера-
тор возвращает информацию об этом типе, причем тип должен
быть полностью определен.
В листинге 38.1 приведен пример динамического определения
типа объектов при помощи оператора
typeid
и использования
методов класса
type_info
.