Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
anonym17
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
#1

Частое использование dynamic_cast в конкретных целях. Правильно ли? - C++

08.01.2014, 22:44. Просмотров 1002. Ответов 21
Метки нет (Все метки)

Привет, форум.
Гуманно ли использовать dynamic_cast вот в таких случаях?
Пример из подобных

- Есть библиотечный абстрактный класс Drawable.
Я наследую его, чтобы создавать разные геометрические объекты.
- Есть класс Polygon - используется как сцена. У него есть поле list<Drawable*> m_drawables и метод Add(Drawable* drawable).
Суть метода Add в том, что он рассчитывает наилучшую позицию для расположения фигуры и кидает его в полигон, т.е, записывает в m_drawables.

Не по теме:

Метод Update циклом прокручивает эти объекты, шагом вызывая метод api.Draw(*it)



Так вот, так как для разных фигур нужны разные расчёты, а я узнаю тип фигуры приведением типа(заодно и получаю доступы к методам конкретной фигуры) используя dynamic_cast.
Пример:
C++
1
2
3
4
5
6
7
8
9
void Add(Drawable* drawable)
{
...
    if (Parallelogram* pg = dynamic_cast<Parallelogram*>(drawable))
    {
        ...
    }
...
}
Это нормально или есть более лучший архитектурный подход?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2014, 22:44     Частое использование dynamic_cast в конкретных целях. Правильно ли?
Посмотрите здесь:

Использование dynamic_cast - C++
#include&lt;iostream&gt; #include&lt;locale.h&gt; using namespace std; class Base { public: virtual void f() {}; }; class Der :...

Наследование, dynamic_cast и использование последнего в связке с первым - C++
Задание: написать отдалённую симуляцию интерфейса в виде консольного приложения, тоесть класс окно, в которое можно засовывать различные...

MS VC++ 6.0:Как "подавить" выдачу конкретных варнингов в конкретных местах? - C++
Не хочу, чтобы выдавались конкретные варнинги, относящиеся к определённым областям заданных файлов. Как это сделать. Про &quot;Warning...

dynamic_cast - C++
Помогите разобраться с dynamic_cast, а точнее с вот этой записью void f() { A* pa = new A; B* pb = new B; void* pv =...

dynamic_cast - C++
Подскажите пожалуйста, возникла проблема. Есть базовый клас CStep. И пока один наследник: class CStepMove : public CStep Ести вектор...

dynamic_cast - C++
Уважаемые, подскажите теорию. Как устроен данный каст? Не нашел его определений. В студии он зашит в библиотеку, подсказок в хелпе про него...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
08.01.2014, 22:48     Частое использование dynamic_cast в конкретных целях. Правильно ли? #2
Цитата Сообщение от anonym17 Посмотреть сообщение
Это нормально или есть более лучший архитектурный подход?
А почему нет? Если результат вас удовлетворят - используйте.
anonym17
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
08.01.2014, 22:51  [ТС]     Частое использование dynamic_cast в конкретных целях. Правильно ли? #3
Цитата Сообщение от xtorne21st Посмотреть сообщение
А почему нет? Если результат вас удовлетворят - используйте.
Просто часто ругаются на RTTI, вот почему спрашиваю.
Убежденный
Системный программист
Эксперт С++
15296 / 6928 / 1096
Регистрация: 02.05.2013
Сообщений: 11,336
Завершенные тесты: 1
08.01.2014, 22:58     Частое использование dynamic_cast в конкретных целях. Правильно ли? #4
Цитата Сообщение от anonym17 Посмотреть сообщение
для разных фигур нужны разные расчёты
А нельзя ли, чтобы фигуры сами бы рассчитывали свои наилучшие позиции ?
RTTI не зря ругают, он не бесплатен. Я слышал, что в некоторых реализациях
RTTI реализован через сравнение строк...
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2014, 23:06     Частое использование dynamic_cast в конкретных целях. Правильно ли? #5
такое решение плохо не столько производительностью, сколько плохой расширяемостью.
при появлении новой фигуры вы полезете изменять уже существующий код, что расходится с
Open/Close принципом или как там его.
anonym17
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
08.01.2014, 23:06  [ТС]     Частое использование dynamic_cast в конкретных целях. Правильно ли? #6
Цитата Сообщение от Убежденный Посмотреть сообщение
А нельзя ли, чтобы фигуры сами бы рассчитывали свои наилучшие позиции ?
Но для этого нужно состояние полигона.
Вы предлагаете Parallelogram::Add(list<Drawable*>& drawables) или что?
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2014, 23:14     Частое использование dynamic_cast в конкретных целях. Правильно ли? #7
если хочется поархитектурить - посмотрите в сторону паттерна Visitor.
вроде бы как раз ваш случай. будет без dynamic_cast но с расширением
тоже будет определенный геморрой.
dynamic_cast - вполне себе рабочий вариант. должен работать.
Убежденный
Системный программист
Эксперт С++
15296 / 6928 / 1096
Регистрация: 02.05.2013
Сообщений: 11,336
Завершенные тесты: 1
08.01.2014, 23:16     Частое использование dynamic_cast в конкретных целях. Правильно ли? #8
C++
1
2
3
4
void Polygon::Add(Drawable *pDrawable)
{
    pDrawable->CalculateBestPosition(this);
}
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2014, 23:21     Частое использование dynamic_cast в конкретных целях. Правильно ли? #9
C++
1
2
3
4
void Polygon::Add(Drawable *pDrawable)
{
    pDrawable->CalculateBestPosition(this);
}
такой вариант - не айс.
Drawable связывается с неким Poligon который возможно так же наследник от Drawable.
тут взяли и засрали интерфейс. В результате все Drawable, которые могут быть и не фигурой
а скажем картинкой или еще хз чем, зависят от полигона в который они концептуально
не могут добавляться.
anonym17
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
08.01.2014, 23:23  [ТС]     Частое использование dynamic_cast в конкретных целях. Правильно ли? #10
Цитата Сообщение от Убежденный Посмотреть сообщение
C++
1
2
3
4
void Polygon::Add(Drawable *pDrawable)
{
    pDrawable->CalculateBestPosition(this);
}
Drawable - библиотечный класс, я его менять не могу. Можно конечно сделать промежуточный класс, но тогда появляются другие проблемы с использованием его в Api данной библиотеки, снова тот же dynamic_cast.
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2014, 23:27     Частое использование dynamic_cast в конкретных целях. Правильно ли? #11
раз это библиотечный интерфейс - тогда приделать посетителя без прокси классов наверно не выйдет.
ну или я не знаю как. без динамического приведения тоже хз как сделать.
anonym17
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
08.01.2014, 23:38  [ТС]     Частое использование dynamic_cast в конкретных целях. Правильно ли? #12
Всё таки надо архитектуру пересмотреть или же забить и использовать dynamic_cast?
Убежденный
Системный программист
Эксперт С++
15296 / 6928 / 1096
Регистрация: 02.05.2013
Сообщений: 11,336
Завершенные тесты: 1
08.01.2014, 23:40     Частое использование dynamic_cast в конкретных целях. Правильно ли? #13
Цитата Сообщение от DU Посмотреть сообщение
такой вариант - не айс.
Drawable связывается с неким Poligon который возможно так же наследник от Drawable.
тут взяли и засрали интерфейс. В результате все Drawable, которые могут быть и не фигурой
а скажем картинкой или еще хз чем, зависят от полигона в который они концептуально
не могут добавляться.
Согласен. Просто как вариант на замену dynamic_cast.
Я просто содрогаюсь, представляя десятки этих кастов, и так для
каждого элемента в массиве... Бр-р!..
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2014, 23:48     Частое использование dynamic_cast в конкретных целях. Правильно ли? #14
да при касте врятли что-то динамически выделяется. в сравнении с динамическим добавлением и рассчетами для оптимальной вставки - это копейки. у нас ведь тут добавление чего-то. и одна маленькая отрисовочка возможно затмит собой тысячи этих кастов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2014, 00:06     Частое использование dynamic_cast в конкретных целях. Правильно ли?
Еще ссылки по теме:

Dynamic_cast - C++
#include &lt;iostream&gt; #define STOP cin.get(); using std::cin; using std::cout; class A { public: // void foo()

dynamic_cast - C++
#include &lt;iostream&gt; class B { public: virtual void foo(){std::cout&lt;&lt;&quot;B&quot;;} private: int a; }; class D : public B { ...

Dynamic_cast и полиморфизм - C++
Задача: В листинге 15.16 после каждого блока try находятся два блока catch, поэтому исключение nbad_index приводит к вызову метода...

dynamic_cast() шаблон - C++
Здорова! Пытаюсь свой шаблон функции создать dynamic_cast() это ptr_cast() но ничо не получается. Не могу никак сам шаблон написать ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
anonym17
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
09.01.2014, 00:06  [ТС]     Частое использование dynamic_cast в конкретных целях. Правильно ли? #15
Цитата Сообщение от DU Посмотреть сообщение
да при касте врятли что-то динамически выделяется. в сравнении с динамическим добавлением и рассчетами для оптимальной вставки - это копейки. у нас ведь тут добавление чего-то. и одна маленькая отрисовочка возможно затмит собой тысячи этих кастов.
А если использовать паттерн Visitor?
Yandex
Объявления
09.01.2014, 00:06     Частое использование dynamic_cast в конкретных целях. Правильно ли?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru