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

 
Аналог оператора is
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



вот и я о том же.
консенсус достигнут.

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