![]() |
|
Модераторы: bsa |
![]()
|
|
| ZVano |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 259 Регистрация: 11.12.2006 Где: Украина, Кривой Р ог Репутация: 1 Всего: 4 |
Есть несколько POD структур.
Одна из них базовая (IShape), остальные наследники (IShapeRectangle, IShapeSquare). Создаем по экземпляру наследников и передаем их в процедуру ShapeDraw как указатель на объект базового типа. В процедуре ShapeDraw нужно выполнить обратное преобразование - из базового IShape получить целевой IShapeRectangle либо IShapeSquare. Идентификация реального типа наследника происходит по коду в IShape->Code который указывается вручную при заполненни данными реального объекта. Но т.к. все структуры являются POD типом, к ним нельзя применить dynamic_cast, а явное приведение вида shapeType * myShape = (shapeType *) myIShape Как надежно выполнить проверку и приведение типа? Вот пример кода на liveworkspace.org
Результат
Это сообщение отредактировал(а) ZVano - 2.9.2011, 13:10 -------------------- НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению. Гуглим "Как правильно задавать вопросы" |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
я неPOD`ами их сделать нельзя? Добавлено через 2 минуты и 4 секунды тут public не нужен. структуры по умолчанию наследуются публично. |
|||
|
||||
| ZVano |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 259 Регистрация: 11.12.2006 Где: Украина, Кривой Р ог Репутация: 1 Всего: 4 |
Вроде нельзя, но не уверен на 100%. Реальная задача - обмен данными между плагинами, а в 1м посте максимально упрощенный пример для иллюстрации проблеммы. Есть Plugin1 и Plugin2. Это структуры от базового интерфейса IPlugin. В IPlugin определен виртуальный метод
Он обязан быть реализован во всех плагинах-наследниках и предназначен для прямой коммуникачии между плагинами. Т.е. Plugin1 и Plugin2 обнозначно содержат метод IPlugin_MessageParse. Но передать туда можно данные любого типа, производного от TPluginMessage. *Например: ** Plugin1 и Plugin2 знают публичный интерфейс друг-друга. ** Plugin1 хочет вызвать внутренне действие Plugin2 (допустим, нарисовать меню код - C_PLUGIN2_DRAW_PLUGIN_MENU). **В Plugin2 объявляется публичная структура
*** Plugin1 подготавливает структуру с данными типа TPlugin2Message_DrawPluginMenu msgXXX Указывает код C_PLUGIN2_DRAW_PLUGIN_MENU Указывает menuData *** Вызывает метод Plugin2->IPlugin_MessageParse(&msgXXX); ***Plugin2 **** читает из msgXXX->msgCode который == C_PLUGIN2_DRAW_PLUGIN_MENU **** приводит msgXXX к типу TPlugin2Message_DrawPluginMenu **** вызполняет генерацию меню PS: Возможно, я использую неверный подход, но другого в голову не приходит. -------------------- НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению. Гуглим "Как правильно задавать вопросы" |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
из всего тобою описанного, я не вижу требования для IShape быть POD`ом.
|
|||
|
||||
| ZVano |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 259 Регистрация: 11.12.2006 Где: Украина, Кривой Р ог Репутация: 1 Всего: 4 |
Если объявить TPluginMessage nPOD-ом то можно спокойно использовать такой интерфейсный файл из разных компиляторов c++.
Но если потребуется сделать интервейсный файл для Delphi, то там тоже прийдется писать тело конструктора. Для других языков то же самое. А в идее было создать просто интерфейс без реализации, поэтому и использовал nPOD. -------------------- НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению. Гуглим "Как правильно задавать вопросы" |
||||
|
|||||
| mes |
|
||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
при чем тут вообще Pod /неPod ?!
Добавлено через 3 минуты уже неPod
не по этому ..
а что ж static_cast зыбываем ?! Добавлено через 5 минут и 4 секунды
а какое это вообще имеет отношение к касту ?! это вопрос по проектированию.. Добавлено через 8 минут и 28 секунд
и с каких это пор к наследникам интерфейса "нeприменим" dynamic_cast ? Добавлено через 9 минут и 13 секунд |
||||||||
|
|||||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
перечитал еще раз.. не "от базового интерфейса" а просто структуры, в данном случае структуры-сообщения.. Добавлено через 1 минуту и 14 секунд но написаноп все равно жутко... пострайтесь сформулировать вопрос ясно, не опираясь на термины значения которых не до конца понимаете.. |
|||
|
||||
| ZVano |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 259 Регистрация: 11.12.2006 Где: Украина, Кривой Р ог Репутация: 1 Всего: 4 |
Действительно, ведь было наследование п.3.4.b. А почему? Пишет же что IShape "source type is not polymorphic" Не помогает Нужно сделать так, чтобы приведение не выполнялось если тип неверен.
Как тогда объяснить это http://liveworkspace.org/code/9a7d3e17b78f...320e651c3db6612
Тему интерфейсов и плагинов предлагаю покаместь отложить. Давайте решим основной вопрос, либо прийдем к выводу что он нерешаем. Мне нужно в процедуре void ShapeDraw(IShape * shape) определить является ли shape экземпляром IShapeRectangle или нет. Это сообщение отредактировал(а) ZVano - 2.9.2011, 16:36 -------------------- НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению. Гуглим "Как правильно задавать вопросы" |
||||||||
|
|||||||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
полиморфизм и Pod не связанные по сути сущности.. Добавлено через 2 минуты и 53 секунды
и откуда программа будет знать, что тип неверен ?! как уже говорилось Добавлено через 5 минут и 34 секунды
так плагины Вы сами впихнули, а чтоб решить основной вопрос, его нужно как минимум сформулировать.. если вопрос : какой каст угадает у неполиморфного типа правильность приведения ? - то он не решаем Добавлено через 9 минут и 13 секунд
ассоцируйте тип с неким кодом и проверяйте его.. |
||||||
|
|||||||
| ZVano |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 259 Регистрация: 11.12.2006 Где: Украина, Кривой Р ог Репутация: 1 Всего: 4 |
Да, вопрос именно в этом и состоял. Спасибо. В первом примере так и сделал. Но при таком подходе возможны ошибки в случае, когда код фигуры задан неверно. И отследить их будет трудно. Как правильно решить эту проблемму? Как изменить классы чтобы можно было применить "dynamic_cast" к "IShape *"? >> что почитать -------------------- НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению. Гуглим "Как правильно задавать вопросы" |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
избавиться от рассоглaсования между типом и кодом.. в простых случаях достаточно доверить установку значения конструктору/функции-создателю..
добавить в базу виртуальные методы (можно обойтись только виртуальным деструктором).. Это сообщение отредактировал(а) mes - 2.9.2011, 17:09 |
|||
|
||||
| newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 3 Всего: 19 |
Как-то все сумбурно, почему нельзя использовать наследование и dynamic_cast я так и не поняла.
Если все возможные типы наследников заранее известны, можно сделать так:
Нужно ассоциировать тип с элементом юниона и в рантайме можно будет определять, что за зверь используется. Это сообщение отредактировал(а) newbee - 2.9.2011, 17:11 -------------------- You're face to face With man who sold the world |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
*union в приведенном выше примере фактически нужен для безопасного копированния объекта независимо от типа содержимого..
Добавлено через 33 секунды то есть задачу соответсвия типа значению не решает.. |
|||
|
||||
| ZVano |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 259 Регистрация: 11.12.2006 Где: Украина, Кривой Р ог Репутация: 1 Всего: 4 |
Все гениальное просто. Вот результат
-------------------- НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению. Гуглим "Как правильно задавать вопросы" |
||||||
|
|||||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |