Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4260

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Часть 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) 
  { 


background image

Глава 37. Классы стандартных исключений <stdexcept> 

 

417 

    cout << e.what() << endl; // invalid bitset<N> position 
  } 
 
  cout << "Press any key to exit." << endl; 
  cin.get(); 
 
  return 0; 

 


background image

  

 
 

Г Л А В А  

38 

 
 

Динамическая 

идентификация типов 

<typeinfo> 

38.1. Динамическая  
идентификация типов 

Под динамической идентификацией типов (RTTI, Run-Time Type 
Identification)  понимают  определение  типа  объекта,  на  который 
ссылается ссылка или указывает указатель, во время исполнения 
программы. Если тип ссылки или указателя полиморфный, то ди-
намическая  идентификация  типов  позволяет  определить  тип  ре-
ального объекта, на который ссылается эта ссылка или указывает 
указатель, во время исполнения программы. Если же тип ссылки 
или  указателя  не  является  полиморфным,  то  определение  типа 
объекта  выполняется  статически  во  время  компиляции  про- 
граммы. 
Для  поддержки  динамической  идентификации  и  преобразования 
типов  объектов  в  заголовочном  файле  typeinfo  определены  сле-
дующие классы: 

  namespace std 
  { 
    class type_info; 
    class bad_cast; 
    class bad_typeid; 
  } 

  

 


background image

Глава 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

, который рассмотрен в следую-

щем разделе. 


background image

Часть 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


Смотрите также файлы