Бьерн Страуструп. Язык программирования С++ Второе дополненное издание


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



Pdf көрінісі
бет245/256
Дата11.07.2022
өлшемі2,87 Mb.
#37591
1   ...   241   242   243   244   245   246   247   248   ...   256
Байланысты:
Бьерн Страуструп. Язык программирования С . М Бином, 2011

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; } 


Бьерн Страуструп.
Язык программирования С++ 
 
350 


Достарыңызбен бөлісу:
1   ...   241   242   243   244   245   246   247   248   ...   256




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет