Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

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

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

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

Добавлен: 13.12.2020

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

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

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

Глава 38. Динамическая идентификация типов <typeinfo> 

421 

Листинг 38.1. Динамическое определение типа объекта 

#include <iostream> 
#include <typeinfo> 
using namespace std; 
 
class Base 

  virtual f() {}; 
}; 
class Derived: public Base {}; 
 
int main() 

  Base *p = new Base; 
  Derived *q = new Derived; 
 
  cout << (typeid(*p) == typeid(*q)) << endl;  // 0 
  cout << (typeid(*p) != typeid(*q)) << endl;  // 1 
 
  cout << (typeid(*p).before(typeid(*q))) << endl;  // 1 
  delete p; 
  p = q; 
 
  cout << typeid(*p).name() << endl;  // class Derived 
  cout << typeid(*q).name() << endl;  // class Derived 
  delete q; 
   
  return 0; 
   

38.4. Обработка исключения 

bad_typeid

 

Если  операндом  оператора 

typeid

  является  пустой  указатель,  то 

этот оператор выбрасывает исключение типа 

bad_typeid

, который 

имеет следующий интерфейс: 


background image

Часть IV. Стандартная библиотека языка программирования С++ 

422 

  namespace std 
  { 
    class bad_typeid : public exception 
    { 
    public: 
      bad_typeid() throw(); 
      bad_typeid(const bad_typeid&) throw(); 
      bad_typeid& operator=(const bad_typeid&) throw(); 
      virtual ~bad_typeid() throw(); 
      virtual const char* what() const throw(); 
    }; 
  } 

Отсюда  видно,  что  класс 

bad_typeid

  наследуется  от  класса 

exception

. Метод 

what

 этого класса возвращает указатель на стро-

ку  языка  программирования  C,  содержание  которой  зависит  от 
реализации. 
В  листинге  38.2  приведен  пример  обработки  исключения  типа 

bad_typeid

Листинг 38.2. Обработка исключения типа 

bad_typeid

 

#include <iostream> 
#include <typeinfo> 
using namespace std; 
 
class Demo 

  virtual ~Demo() {}; 
}; 
int main() 

  Demo* d = NULL; 
   
  try 
  { 
    typeid(*d); 
  } 


background image

Глава 38. Динамическая идентификация типов <typeinfo> 

423 

  catch (bad_typeid& e) 
  { 
    cout << e.what() << endl; 
  } 
 
  return 0; 

38.5. Обработка  

исключения 

bad_cast

 

Если  операндом  оператора 

dynamic_cast

  является  пустой  указа-

тель,  то  этот  оператор  выбрасывает  исключение  типа 

bad_cast

который имеет следующий интерфейс: 

  namespace std 
  { 
    class bad_cast : public exception 
    { 
    public: 
      bad_cast() throw(); 
      bad_cast(const bad_cast&) throw(); 
      bad_cast& operator=(const bad_cast&) throw(); 
      virtual ~bad_cast() throw(); 
      virtual const char* what() const throw(); 
    }; 
  } 

Отсюда  видно,  что  класс 

bad_cast

  наследуется  от  класса 

exception

. Метод 

what

 этого класса возвращает указатель на стро-

ку  языка  программирования  C,  содержание  которой  зависит  от 
реализации. 
В  листинге  38.3  приведен  пример  обработки  исключения  типа 

bad_cast

Листинг 38.3. Обработка исключения типа 

bad_cast

 

#include <typeinfo.h> 
#include <iostream> 


background image

Часть IV. Стандартная библиотека языка программирования С++ 

424 

using namespace std; 

class Base 

  virtual f() {}; 
}; 
class Derived: public Base {}; 
void f(Base& b) { Derived& rd = dynamic_cast<Derived&>(b); } 
 
int main() 

  Base b; 
  Derived d; 
 
  try 
  { 
    f(d); 
    cout << "f(d)" << endl;  // f(d) 
    f(b); 
    cout << "f(b)" << endl; 
  } 
  catch (bad_cast& e) 
  { 
    cout << e.what() << endl;  // Bad dynamic_cast 
  } 
   
  return 0; 

 


background image

  

 
 

Г Л А В А  

39 

 
 
 

Работа со строками  

в С++ <string> 

В заголовочном файле string определяются следующие шаблоны 
классов и их специализации: 

namespace std 

  template<class E> class char_traits; 
  template<> class char_traits<char>; 
  template<> class char_traits<wchar_t>; 
  template<class E, class T = char_traits<E>, 
    class A = allocator<E>> class basic_string; 
  typedef basic_string<char> string; 
  typedef basic_string<wchar_t> wstring; 

Шаблон класса 

char_traits

  определяет  характеристики  объектов 

класса 

E

,  который  является  параметром  шаблона.  При  работе  со 

строками эти объекты обычно называются символами. 
Для шаблона класса 

char_traits

 определены две явные специали-

зации 

char_traits<char>

 и 

char_traits<wchar_t>

, которые опреде-

ляют характеристики типов 

char

 и 

wchar_t

 соответственно. 

Шаблон  класса 

basic_string

  определяет  контейнер,  элементами 

которого  являются  объекты  класса,  задаваемого  параметром 

E

 

этого шаблона. Параметры 

T

 и 

A

 задают классы, которые опреде-

ляют  соответственно  характеристики  и  распределитель  памяти 
для объектов класса 

E

  

 


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