|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
20.07.2012, 17:41 | #1 |
Пользователь
Регистрация: 20.07.2012
Сообщений: 11
|
Определение структуры
Допустим есть функция, принимающая указатель на структуру (тип).
Есть несколько структур (типов) с различными полями, они все должны обрабатываться данной функцией. struct a{int x, y;}; struct b{int x;}; a Sa; b Sb; func(Sa); // Один результат func(Sb); // Другой результат Как узнать, что за структуру передали функции? Добавление дополнительных полей к структурам или определение функцией их размера не предлаать! Последний раз редактировалось mf_fun_mf; 20.07.2012 в 17:45. |
20.07.2012, 17:46 | #2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Если на С, тогда придетстя добавлять аргумент в функции и передавать каким то образом тип структуры. Если на С++, тогда пишите несколько функций с одним именем и каждая с разным типом аргумента - для каждой структуры по одной.
|
20.07.2012, 17:49 | #3 |
Пользователь
Регистрация: 20.07.2012
Сообщений: 11
|
Как не хочется добавлять доп. инфу в структуры или перегружать функции...
|
20.07.2012, 18:07 | #4 |
Форумчанин
Регистрация: 18.02.2012
Сообщений: 155
|
|
23.07.2012, 16:27 | #5 |
Пользователь
Регистрация: 20.07.2012
Сообщений: 11
|
#include <typeinfo.h>
void func(void* ptr) { typeid(ptr).name(); typeid(&ptr).name(); } int a, *pa; ... func(a); func(pa); func(&a); ... Кое-что пробовал передовать функции, typeid даёт только "void *" или "void * *". Как правильно её использовать? |
23.07.2012, 17:16 | #6 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Если это C++ напишите две функции:
func(const a& sa) { ... } func(const b& sb) { ... } Для того чтоб использовать typeid надо все структуры унаследовать от одного родителя, сделать функцию с указателем на этого родителя и включить в опциях компиляторa RTTI |
23.07.2012, 20:20 | #7 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
1. Статическим. Если иерархия не содержит виртуальных методов. И в этом случае вычисления происходят времени компиляции. (в случае автора, он получит типа предка) 2. Динамическим. Если иерархия содержит виртуальные методы. И в этом случае вычисления происходят времени выполнения. RTTI, как известно - тяжелая операция. (в случае автора, он получит тайп_ид потомка, но тайп_ид - это ещё не потомок, и придётся городить огород, что бы пропасти реакцию функции на тот, или иной тайп_ид). А так вообще - имхо, надо быть полным извращенцем, что бы юзать тяжелый RTTI, и городить замороченную инфраструктуру по разветвлениям кода тогда, когда можно обойтись тривиальной перегрузкой. |
|
23.07.2012, 21:08 | #8 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
|
23.07.2012, 21:14 | #9 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
В стандарте не рылся. Но мингв/гцц/судийные компили намекнули мне, что автор цитаты - прав. И да, кстати, классы, которые не содержат ни одного явного виртуального метода, никаких "скрытых" виртуальных так же не содержат. Заодно подумай: зачем разработчикам компиляторов придумывать себе такие сложности с объектом, тип которого итак прекрасно вычисляется на этапе компиляции? |
|
23.07.2012, 21:33 | #10 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Уф
class CParent; class CChild : public CParent; CParent* ptr = new CChild; CChild* crash = dynamic_cast<CChild*>(ptr); typeid(ptr) == ? |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Написание программ (древовидные структуры, структуры неспециального вида и т.д.) | Green Gin | Фриланс | 2 | 27.04.2012 15:26 |
Управляющие структуры. Программирование алгоритмов разветвляющейся структуры. | Лёнка | Компоненты Delphi | 1 | 23.04.2012 15:03 |
C# определение ф-и | Lucky777 | Помощь студентам | 4 | 10.06.2011 01:00 |
Определение по IP | ProgDel | Работа с сетью в Delphi | 3 | 08.11.2010 22:14 |
Линейные структуры - что это? (определение) | MR_Andrew | Помощь студентам | 6 | 07.10.2009 18:38 |