|
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
|
||||||
Частое использование dynamic_cast в конкретных целях. Правильно ли?08.01.2014, 22:44. Показов 2939. Ответов 21
Метки нет (Все метки)
Привет, форум.
Гуманно ли использовать dynamic_cast вот в таких случаях? Пример из подобных - Есть библиотечный абстрактный класс Drawable. Я наследую его, чтобы создавать разные геометрические объекты. - Есть класс Polygon - используется как сцена. У него есть поле list<Drawable*> m_drawables и метод Add(Drawable* drawable). Суть метода Add в том, что он рассчитывает наилучшую позицию для расположения фигуры и кидает его в полигон, т.е, записывает в m_drawables. Не по теме: Метод Update циклом прокручивает эти объекты, шагом вызывая метод api.Draw(*it) Так вот, так как для разных фигур нужны разные расчёты, а я узнаю тип фигуры приведением типа(заодно и получаю доступы к методам конкретной фигуры) используя dynamic_cast. Пример:
0
|
||||||
| 08.01.2014, 22:44 | |
|
Ответы с готовыми решениями:
21
Использование dynamic_cast
|
|
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
|
|
| 08.01.2014, 22:48 | |
|
0
|
|
|
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
|
|
| 08.01.2014, 22:51 [ТС] | |
|
0
|
|
|
Ушел с форума
|
||
| 08.01.2014, 22:58 | ||
|
RTTI не зря ругают, он не бесплатен. Я слышал, что в некоторых реализациях RTTI реализован через сравнение строк...
0
|
||
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 08.01.2014, 23:06 | |
|
такое решение плохо не столько производительностью, сколько плохой расширяемостью.
при появлении новой фигуры вы полезете изменять уже существующий код, что расходится с Open/Close принципом или как там его.
0
|
|
|
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
|
||
| 08.01.2014, 23:06 [ТС] | ||
|
Вы предлагаете Parallelogram::Add(list<Drawable*>& drawables) или что?
0
|
||
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 08.01.2014, 23:14 | |
|
если хочется поархитектурить - посмотрите в сторону паттерна Visitor.
вроде бы как раз ваш случай. будет без dynamic_cast но с расширением тоже будет определенный геморрой. dynamic_cast - вполне себе рабочий вариант. должен работать.
1
|
|
|
Ушел с форума
|
||||||
| 08.01.2014, 23:16 | ||||||
0
|
||||||
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||
| 08.01.2014, 23:21 | ||
Drawable связывается с неким Poligon который возможно так же наследник от Drawable. тут взяли и засрали интерфейс. В результате все Drawable, которые могут быть и не фигурой а скажем картинкой или еще хз чем, зависят от полигона в который они концептуально не могут добавляться.
1
|
||
|
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
|
||
| 08.01.2014, 23:23 [ТС] | ||
0
|
||
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 08.01.2014, 23:27 | |
|
раз это библиотечный интерфейс - тогда приделать посетителя без прокси классов наверно не выйдет.
ну или я не знаю как. без динамического приведения тоже хз как сделать.
0
|
|
|
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
|
|
| 08.01.2014, 23:38 [ТС] | |
|
Всё таки надо архитектуру пересмотреть или же забить и использовать dynamic_cast?
0
|
|
|
Ушел с форума
|
||
| 08.01.2014, 23:40 | ||
|
Я просто содрогаюсь, представляя десятки этих кастов, и так для каждого элемента в массиве... Бр-р!..
0
|
||
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 08.01.2014, 23:48 | |
|
да при касте врятли что-то динамически выделяется. в сравнении с динамическим добавлением и рассчетами для оптимальной вставки - это копейки. у нас ведь тут добавление чего-то. и одна маленькая отрисовочка возможно затмит собой тысячи этих кастов.
0
|
|
|
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
|
|
| 09.01.2014, 00:06 [ТС] | |
|
0
|
|
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||
| 09.01.2014, 00:12 | ||
|
А если использовать паттерн Visitor?
0
|
||
|
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
|
||||||
| 09.01.2014, 00:29 [ТС] | ||||||
|
Ну если введу промежуточный класс Depictable и буду все фигуры от него наследовать? Правда это сулит мне проблемы с самим Api библиотеки.
Или это вообще изначально плохой подход?
0
|
||||||
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 09.01.2014, 00:38 | |
|
а вы и так и эдак попробуйте. будет вам опыт на будущее.
интерфейс добавления объектов в полигон остается одинаковым при обоих подходах. так что то, как там все разруливается - деталь реализации. с визитором однозначно более многословно все будет.
1
|
|
|
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
|
|||||||
| 09.01.2014, 06:08 [ТС] | |||||||
0
|
|||||||
|
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
|
|
| 09.01.2014, 15:17 | |
|
Этот паттерн вообще не рекомендуют использовать... Его очень сложно сопровождать... Я не пойму чем вам dynamic_cast не нравится? Это простое и правильное решение, ИМХО
0
|
|
| 09.01.2014, 15:17 | |
|
Помогаю со студенческими работами здесь
20
Наследование, dynamic_cast и использование последнего в связке с первым Использование пиратской версии в коммерчиских целях Использование формата BMP в коммерческих целях Использование микрофона в игре в непредусмотренных целях Использование голосовых сервисов Google в своих целях Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|