Язык программирования C++ от Страуструпа


.Класс Type_info


В классе Type_info есть минимальный объем информации для реализации операции ptr_cast(); его можно определить следующим образом:

class Type_info {

  const char* n;                   // имя

  const Type_info** b;             // список базовых классов

  public:

     Type_info(const char* name, const Type_info* base[]);

     const char* name() const;

     Base_iterator bases(int direct=0) const;

     int same(const Type_info* p) const;

     int has_base(const Type_info*, int direct=0) const;

     int can_cast(const Type_info* p) const;

     static const Type_info info_obj;

     virtual typeid get_info() const;

     static typeid info();

};

Две последние функции должны быть определены в каждом производном от Type_info классе.

Пользователь не должен заботиться о структуре объекта Type_info, и она приведена здесь только для полноты изложения. Строка, содержащая имя типа, введена для того, чтобы дать возможность поиска информации в таблицах имен, например, в таблице отладчика. С помощью нее а также информации из объекта Type_info можно выдавать более осмысленные диагностические сообщения. Кроме того, если возникнет потребность иметь несколько объектов типа Type_info, то имя может служить уникальным ключом этих объектов.

const char* Type_info::name() const

{

  return n;

}

int Type_info::same(const Type_info* p) const

{

  return this==p || strcmp(n,p->n)==0;

}

 

int Type_info::can_cast(const Type_info* p) const

{

  return same(p) || p->has_base(this);

}

Доступ к информации о базовых классах обеспечивается функциями bases() и has_base(). Функция bases() возвращает итератор, который порождает указатели на базовые классы объектов Type_info, а с помощью функции has_base() можно определить является ли заданный класс базовым для другого класса. Эти функции имеют необязательный параметр direct, который показывает, следует ли рассматривать все базовые классы (direct=0), или только прямые базовые классы (direct=1). Наконец, как описано ниже, с помощью функций get_info() и info() можно получить динамическую информацию о типе для самого класса Type_info.




- Начало -  - Назад -  - Вперед -



Книжный магазин