Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
focus Гость
|
Добавлено: Пн Мар 11 2002 17:49 Заголовок сообщения: Вот в С++ проблема (работа с объектами)вышла. Помогите кто может. |
|
|
Вот и спасибо! Ладно у меня вот такая незадача. В С++ надо как - то сделать вот, что. Определить является ли для определённого объекта некоторый класс родительский. На сколько я знаю в Дельфи есть некоторый способ. А вот как там с С++ дела обстоят. За ранее благодарен. |
|
Вернуться к началу |
|
|
AndreyC
Зарегистрирован: 11.03.2002 Сообщения: 3
|
Добавлено: Пн Мар 11 2002 19:06 Заголовок сообщения: Re: Вот в С++ проблема (работа с объектами)вышла. Помогите кто может. |
|
|
Давно не писал на С++, но сдается мне, что dynamic_cast (точное название не помню) возвратит NULL, если преобразование не возможно. |
|
Вернуться к началу |
|
|
focus Гость
|
Добавлено: Вт Мар 12 2002 09:06 Заголовок сообщения: Re: Вот в С++ проблема (работа с объектами)вышла. Помогите кто может. |
|
|
>>Давно не писал на С++, но сдается мне, что dynamic_cast (точное название не помню) возвратит NULL, если преобразование не возможно.
Вот вроде то. Спасибо. Огромное . Я буду всем благодарен за другую информацию. |
|
Вернуться к началу |
|
|
Alexy
Зарегистрирован: 22.10.2003 Сообщения: 48
|
Добавлено: Вт Мар 12 2002 12:05 Заголовок сообщения: Re: Вот в С++ проблема (работа с объектами)вышла. Помогите кто может. |
|
|
Если ты пользуешься MFC, то можно так: CRuntimeClass* rtc = RUNTIME_CLASS(class_name); boolrtc->IsDerivedFrom(RUNTIME_CLASS(base_.. других бибилиотках могут быть др. имена ф-ций и макросов, но содержание то же. Вот схема одного из вариантов:
1. Пишем класс RTCList со статическими ф-ми void add(RTClassInfo*); RTClassInfo* forName(const char*); bool isDerivedFrom(RTClassInfo*); ... Класс RTCList поддерживает статическую коллекцию кассов-описателей.
2. Каждый класс, желающий быть rttiable декларирует пару макросов, скажем DECLARE_DYN_CREATE(class_name) в декларации класса, и IMPLEMENT_DYN_CREATE(class_name, base_class_name) в подходящем cpp файле.
DECLARE_DYN_CREATE добавляет в класс декларации static объекта типа RTClassInfo и static ф-цию BaseObject* __cdecl _createFun(); + всё на что хватит фантазии (напр. поддержку virtual inheritance)
Что делает IMPLEMENT_DYN_CREATE уже понятно. c-tor RTClassInfo может выглядеть так:
RTClassInfo::RTClassInfo(const char* clName, const char* baseName, BaseObject* (__cdecl CREATOR*)()) { ... init data-members; RTCList::add(this); ... }
Поскольку RTClassInfo - static объект, к тому времени, когда программа начнёт выполнятся, RTCList уже будет знать о всех существующих инстансах RTClassInfo.
А вот так создаётся объект:
RTClassInfo* rtc = RUN_TIME_CLASS(MyObject); if(!rtc) throw BadRequestException(.....); MyObject* obj = (MyObject*) rtc->newInstance();
RTClassInfo::newInstance() просто вызывает CREATOR. Поскольку речь идёт о generic механизме, ф-я CREATOR (а за ней и newInstance) возвращают BaseObject*, а не MyObject*. По этой же причине каждый класс поддерживающий такую инстантиацию должен иметь c-tor без параметров.
Конечно MyObject* obj = (MyObject*) ... выглядит подозрительно, но в данном случае downcast абсолютно надёжен, поскольку RTClassInfo для MyObject может создать только MyObject. |
|
Вернуться к началу |
|
|
|