Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Поле типа, виртуальные функции или RTTI 13.07.03 15:21 Число просмотров: 1251
Автор: amirul <Serge> Статус: The Elderman Отредактировано 13.07.03 15:35 Количество правок: 3
|
> TYPE1 *t1; > TYPE2 *t2; > > func(t1); > func(t2); > > сама функция примерно такая: > > func(void *ptr) { > //.. > } > > реально ли внутри функции определить на какой тип данных > указывает ptr? > > if (sizeof(*ptr) == sizeof(TYPE1)) { > //.. > } > else { > //.. > } > > на подобный код компилятор (VC++) выдает: > error C2100: illegal indirection (оператор * применен не к > указателю) > хотя ptr это указатель. И правильно делает, потому что на момент разыменования этот указатель имеет тип void *. А разыменовывать такие указатели нельзя по определению.
Если тебе необходимо подобное на С, то пожалуй единственное что тебе остается это завести для обоих типов общий заголовок и хранить информацию там:
struct common_header {
enum type_enum {
type1,
type2
} type;
};
struct MOD_TYPE1 {
common_header;
TYPE1 t;
};
struct MOD_TYPE2 {
common_header;
TYPE2 t;
};
Делаешь
void
func(common_header *ptr) {
switch (ptr->type) {
case common_header::type1: {
TYPE1 *t1ptr = (TYPE1 *)(ptr + 1);
// ...
}
case common_header::type2: {
TYPE2 *t2ptr = (TYPE2 *)(ptr + 1);
// ...
}
default:
// ERROR: unknown type
}
}
---
Задавать поле типа придется самому при создании объектов:
//...
{
MOD_TYPE1 t1;
t1.type = common_header::type1;
// initializing and using of t1.t
func((common_header)&t1);
}
---
Ну а если пишешь на C++, то у тебя появляется гораздо более удобный механизм виртуальных функций и RTTI (run-time type information). Хотя есть крайне мало ситуаций, когда RTTI действительно необходим. Уж лучше использовать абстрактный базовый класс, предоставляющий общий интерфейс из виртуальных функций, для обоих типов. А потом работать с указателем на этот абстрактный базовый класс.
|
|
|