C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Создание объектов (динамического типа)
nik
Отправлено: 31.10.2005, 14:40


Не зарегистрирован







Hi, All!

При программировании задачи с БД возникла необходимость динамически создавать VCL-объекты заранее (на этапе компиляции) неизвестного типа (есть только строка с именем типа). Все возможные типы описаны в программе, но выбор конкретного должен определяться строкой с его именем. Как это можно сделать? Чувствую RTTI мне поможет, но как непонятно: RTTI дает возможность узнать тип объекта, если на него есть только указатель void*, а вот как создать такой объект, передав RTTI наименование типа, что-то типа void* p = new RTTI_Create( varTypeName )?

Хочется вместе с объектом в БД хранить данные, позволяющие вызывать нужное диалоговое окно для редактирования этого объекта, например наименование типа "TfmTovarEdit" (упрощенное описание).

Заранее спасибо!
** Zoth
Отправлено: 31.10.2005, 15:09


Не зарегистрирован







Писать тут лень, если хочешь то стучись в аску 191852314 расскажу как я это делал... или на мыл ildarSFH@mail.ru
Asher
Отправлено: 31.10.2005, 16:13


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.

Примитивный вариант:
заводишь map в котором лежит строковое имя класса и соответствующий ему уникальный индекс.
По этому индексу делается switch с кучей case внутри которых создается нужный тебе объект.

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

Подробности смотри в А.Александреску "Современное проектирование на C++".
Скачать можно здесь Anatolix, но лучше купить. Стоит ~200р, но книга однозначно must have
nik
Отправлено: 31.10.2005, 16:28


Не зарегистрирован







Спасибо!

Про я case'ы я уже подумывал, искал способ без них, хотя ничего сложного и нет.

С возвратом к общему типу проблем нет — создаваться будут наследники TForm, так что все ok.

Вернуться в Вопросы программирования в C++Builder