juice |
Отправлено: 11.05.2005, 10:30 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 33
|
Подскажите пожалуйста, какой аналог оператора Delphi "is" в C++ ? |
|
olegenty |
Отправлено: 11.05.2005, 10:42 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
dynamic_cast
например:
CODE |
void __fastcall TXxx::OnYyy(TObject *Sender)
{
if (TYourType *p = dynamic_cast< TYourType* >(Sender))
{
...
}
}
|
|
|
xim |
Отправлено: 11.05.2005, 10:45 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 143
|
В BCB нет строгой типизации, как в Delphi. Поэтому точно узнать тип переменной можно только при работе с COM — объектами. Переменные являются экземплярами какого-нибудь класса или они скалярного типа? |
|
Vlad |
Отправлено: 11.05.2005, 10:46 |
|
Машинист паровоза
Группа: Участник
Сообщений: 231
|
Выдержка из хелпа:
Object Pascal allows parameters of an unspecified type. These parameters are passed to functions with no type defined. The receiving function must cast the parameter to a known type before using it. C++Builder interprets untyped parameters as pointers-to-void (void *). The receiving function must cast the void pointer to a pointer of the desired type. Following is an example:
int myfunc(void* MyName)
{
// Cast the pointer to the correct type; then dereference it.
int* pi = static_cast(MyName);
return 1 + *pi;
}
Ну а тебе скорее всего нужно dynamic_cast
VersionInfoComponent = dynamic_cast(this->GetComponent(0)); |
|
olegenty |
Отправлено: 11.05.2005, 10:47 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
2 xim: нет строгой типизации??? впервые слышу! расскажи подробнее...
|
|
juice |
Отправлено: 11.05.2005, 10:47 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 33
|
Я перевожу программу на С, и вот такой код:
if Msg.MessageParts.Items[intIndex] is TIdText then ...
(Комопоненты Indy, считывание аттачментов письма) |
|
xim |
Отправлено: 11.05.2005, 10:48 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 143
|
2Olegenty: оператор is не приводит к типу, а проверяет его |
|
olegenty |
Отправлено: 11.05.2005, 10:50 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
Вот что-то такое:
CODE |
if (TIdText *t = dynamic_cast<TIdText*>(Msg->MessageParts->Items[intIndex]))
{
...
}
|
|
|
olegenty |
Отправлено: 11.05.2005, 10:53 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
2 xim: dynamic_cast приводит к типу ТОЛЬКО ЕСЛИ ЭТО ВОЗМОЖНО. попрошу не путать с reinterpret_cast
|
|
xim |
Отправлено: 11.05.2005, 10:53 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 143
|
2olegenty:
CODE |
char *get_type_par(void *a)
{
// вставьте пожалуйста универсальный код
}
...
Примеры:
int a1;
AnsiString a2;
...
get_type_par(&a1);
get_type_par(&a2);
|
В Delphi это решается оператором is |
|
xim |
Отправлено: 11.05.2005, 10:55 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 143
|
QUOTE (olegenty @ 11/05/2005, 10:53) | 2 xim: dynamic_cast приводит к типу ТОЛЬКО ЕСЛИ ЭТО ВОЗМОЖНО. попрошу не путать с reinterpret_cast |
Привести AnsiString * к DWORD можно? |
|
olegenty |
Отправлено: 11.05.2005, 10:57 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
про typeid слышал?
CODE |
// For Delphi objects, typeid returns the static type, not the runtime type
static const char *TypeIdName(TObject *c) {
return typeid(*c).name();
}
// The button’s caption is set to TObject, not TButton.
void __fastcall TForm1::Button1Click(TObject *Sender) {
Button1->Caption = TypeIdName(Button1);
}
|
|
|
xim |
Отправлено: 11.05.2005, 10:58 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 143
|
Да, прошу прощения, забыл, что is и as работают только с объектными типами. Для данного примера dynamic_cast идет. |
|
olegenty |
Отправлено: 11.05.2005, 11:03 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
замечу также, что dynamic_cast НЕ приведёт AnsiString* к DWORD.
|
|
xim |
Отправлено: 11.05.2005, 11:05 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 143
|
QUOTE (olegenty @ 11/05/2005, 10:57) | про typeid слышал?
CODE |
// For Delphi objects, typeid returns the static type, not the runtime type
static const char *TypeIdName(TObject *c) {
return typeid(*c).name();
}
// The button’s caption is set to TObject, not TButton.
void __fastcall TForm1::Button1Click(TObject *Sender) {
Button1->Caption = TypeIdName(Button1);
}
|
|
Конечно слышал. Горячиться не стоит. Просто в Delphi под строгой типизацией подразумевается отсутствие операторов явного преобразования типа, в том числе и для скалярных типов |
|
xim |
Отправлено: 11.05.2005, 11:08 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 143
|
QUOTE (olegenty @ 11/05/2005, 11:03) | замечу также, что dynamic_cast НЕ приведёт AnsiString* к DWORD. |
Конечно не приведет. Он же работает только с ОБЪЕКТНЫМИ типами |
|
xim |
Отправлено: 11.05.2005, 11:12 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 143
|
Да кстати, для этого нужен
CODE |
AnsiString a="asdasd";
reinterpret_cast<DWORD>(&a);
| |
|
olegenty |
Отправлено: 11.05.2005, 11:27 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
вот и я о том же.
консенсус достигнут.
|
|