Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Cpp_Страуструп.doc
Скачиваний:
18
Добавлен:
03.05.2015
Размер:
3.2 Mб
Скачать

13.5.3 Как создать систему динамических запросов о типе

Здесь показано, как можно прямо реализовать динамические запросы

о типе, когда в трансляторе таких возможностей нет. Это достаточно

утомительная задача и можно пропустить этот раздел, так как в нем

есть только детали конкретного решения.

Классы set и slist_set из $$13.3 следует изменить так, чтобы

с ними могли работать операции запросов о типе. Прежде всего, в

базовый класс set нужно ввести функции-члены, которые используют

операции запросов о типе:

class set {

public:

static const Type_info info_obj;

virtual typeid get_info() const;

static typeid info();

// ...

};

При выполнении программы единственным представителем объекта типа

set является set::info_obj, который определяется так:

const Type_info set::info_obj("set",0);

С учетом этого определения функции тривиальны:

typeid set::get_info() const { return &info_obj; }

typeid set::info() { return &info_obj; }

typeid slist_set::get_info() const { return &info_obj; }

typeid slist_set::info() { return &info_obj; }

Виртуальная функция get_info() будет предоставлять операции

ref_type_info() и ptr_type_info(), а статическая функция info()

- операцию static_type_info().

При таком построении системы запросов о типе основная трудность

на практике состоит в том, чтобы для каждого класса объект типа

Type_info и две функции, возвращающие указатель на этот объект,

определялись только один раз.

Нужно несколько изменить класс slist_set:

class slist_set : public set, private slist {

// ...

public:

static const Type_info info_obj;

virtual typeid get_info() const;

static typeid info();

// ...

};

static const Type_info* slist_set_b[]

= { &set::info_obj, &slist::info_obj, 0 };

const Type_info slist_set::info_obj("slist_set",slist_set_b);

typeid slist_set::get_info() const { return &info_obj; }

typeid slist_set::info() { return &info_obj; }

13.5.4 Расширенная динамическая информация о типе

В классе Type_info содержится только минимум информации, необходимой

для идентификации типа и безопасных операций приведения. Но поскольку

в самом классе Type_info есть функции-члены info() и get_info(),

можно построить производные от него классы, чтобы в динамике

определять, какие объекты Type_info возвращают эти функции. Таким

образом, не меняя класса Type_info, пользователь может получать

больше информации о типе с помощью объектов, возвращаемых функциями

dynamic_type() и static_type(). Во многих случаях дополнительная

информация должна содержать таблицу членов объекта:

struct Member_info {

char* name;

Type_info* tp;

int offset;

};

class Map_info : public Type_info {

Member_info** mi;

public:

static const Type_info info_obj;

virtual typeid get_info() const;

static typeid info();

// функции доступа

};

Класс Type_info вполне подходит для стандартной библиотеки. Это

базовый класс с минимумом необходимой информации, из которого

можно получать производные классы, предоставляющие больше информации.

Эти производные классы могут определять или сами пользователи, или

какие-то служебные программы, работающие с текстом на С++, или сами

трансляторы языка.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]