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

 
Заморочка с типами
Андрей
Отправлено: 06.04.2005, 09:48


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







Гм. Помогите пожалуйста с такой заморочкой.
Есть два обьекта разных классов, описывающих древовидную структуру.
TglCheckTreeView — VCL GlobusLib
и
TLMDTreeComboBox — LMD Tools

Заморочка состоит в том, что мне надо пробежать по дереву каждого компонента, составляя запрос в базу, в зависимости от выбора чеков в деревьях этих обьектов. Формирование запроса абсолютно эквивалентно. Вот пришло в голову создать что-то типа
AnsiString MakeQuery(TObject *Sender)
{
Вот тут и главная заморочка.
Я могу получить имя сласса
typeid(*Sender). name() типа const char*,
но как преобразовать Sender к типу, от которого мне изветсно только имя??
dynamic_cast(Sender)
Так как мне потом надо пройти по

for(int i=0;i<(dynamic_cast(Sender))->Items->Count;i++)
{

}
}
Rius
Отправлено: 06.04.2005, 10:23


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

Группа: Участник
Сообщений: 321



Что-нибудь типа этого (хоть и криво):
CODE
if(Sender->ClassName() == "TglCheckTreeView")
{
TglCheckTreeView *tree = (TglCheckTreeView *)Sender;
...
}
if(Sender->ClassName() == "TLMDTreeComboBox")
{
TLMDTreeComboBox *tree = (TLMDTreeComboBox *)Sender;
...
}
Guest
Отправлено: 06.04.2005, 10:25


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







Перекрытые функции
или ветвление (различные варианты)
if (class_name == "class1") ...
else ...
Андрей
Отправлено: 06.04.2005, 12:08


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







Вот этого ветвления и хочеться избежать, так как циклы for () придется выполнять отдельно ДЛЯ каждого if() {}
Вот как получить тип, имея его имя??
AVC
Отправлено: 06.04.2005, 12:54


Ветеран

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



QUOTE (Андрей @ 06/04/2005, 11:08)
Вот этого ветвления и хочеться избежать, так как циклы for () придется выполнять отдельно ДЛЯ каждого if() {}
Вот как получить тип, имея его имя??

Что имеется ввиду под словом тип?
Изначально неверная постановка вопроса если имя класса становится известным только во время выполнения, так как методы можно применять либо к общему предку, либо ветвить (можно обойтись одной функцией), либо к данному классу (перекрытые функции). По моему мнению последнее — самое то, если нет общего предка.

Если под словом тип вы имеете ввиду экземпляр класса то вам поможет dynamic_cast.

А если вам надо сгенерировать функцию в зависимости от параметров проекта — тогда шаблон.
Asher
Отправлено: 06.04.2005, 13:21


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

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



Нормальным решением будет шаблонная функция содержащая цикл и
конструкция if...else ( как в ответе у Guest'а)для приведения Sender к требуемому типу и вызова шаблонной функции.
Андрей
Отправлено: 06.04.2005, 13:28


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







Ну да. Это наверное будет шаблон. Я не так давно занимаюсь с С++ и не использовал шаблоны еще. Можно кратенький пример или ссылку на подробную доку по созданию и использованию?
А что такое — перекрытие функции?? Сорри за глупый вопрос. Можн опример?? Ветвление меня не устраивает, так как код получаеться ОЧЕНЬ большим только для одного ветвления, а если их штук 5 то это совсем не удобно.
Общая идея была такая

AnsiString MyQuery(T*Sender)
{
AnsiString Query;
for(int i=0;i<(dynamic_cast(Sender))->Items->Count;i++)
{

где OltT — тип, передаваемый в Sender
typeid(*Sender). name() --- вот тут и проблема, как получить OldT для dynamic_cast<>()???


if((dynamic_cast(Sender))->Items->Checked)
{
Query+="Всякая байда";
}
}
return Query;
}

Вот только Sender — Разные классы с общим предком TWinControl

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