Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5   вперед  Ctrl      все
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Dimitry Sibiryakov
void* data

в обычных деревьях и ЯП высокого уровня в дереве на каждой ноде void* data - дополнительное поле.
Я этой либе я такого не увидел.
29 май 21, 19:12    [22328836]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394
PetroNotC Sharp
Или работает как раньше?

С умными указателями - нужен общий предок. Иначе деструкторы не сработают. Но в Дельфи, на
которую ты ссылаешься, Data - неумный указатель.

PS:
PetroNotC Sharp
в обычных деревьях и ЯП высокого уровня в дереве на каждой ноде void* data - дополнительное поле.

Тут ты явно хотел сказать "в каждой Дельфи", поскольку шарп позаимствовал оттуда VCL чуть менее чем полностью.

Сообщение было отредактировано: 29 май 21, 19:09
29 май 21, 19:15    [22328838]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Dimitry Sibiryakov,
В принципе мне деструкторы и нужны ручные. Автоматические сильно жизнь портили в COM когда то.
Убираем дерево и очищаем data вручную.
...
Ну дак все заимствуют хорошее. Поле данных прицепом везде приятно и везде есть.
29 май 21, 19:36    [22328844]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
petrav
Member

Откуда:
Сообщений: 2944
Anatoly Moskovsky
petrav
Эти перегрузки — это прямой
аналог оператора switch от типа объекта.

В отличие от switch, variant не дает пропустить обработку типов.
Это принципиальная разница.
Так что это и близко не аналог switch.

Да ну? Как же Ваш std::visit не аналог switch, если он выглядит как статический аналог switch? И он им и является.
Я уж не говорю про то, что при разработке ООП как раз и хотели отойти от множественных switch по типу объекта
разбросанных по всей программе.

Вы говорите: не будет компилироваться? Ну так gcc выдаёт варнинг о том что switch не полон по отношению к enum.
Блин, какая тут разница, если нарушены основы всех основ? Что там с принципом подстановки Лисков?

Anatoly Moskovsky
По решаемой задаче это как раз аналог полиморфизма с абстрактными методами, которые подтипы должны реализовать.

Нет. Потому что принцип подстановки Лисков. То что вы предложили — это switch от типа объекта. Это нарушение
принципов ООП. ИМХО. :)

Сообщение было отредактировано: 29 май 21, 22:21
29 май 21, 22:28    [22328881]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
petrav,
У ООП всего три принципа. Какое нарушено?
29 май 21, 22:40    [22328886]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
AmKad
Member

Откуда:
Сообщений: 5297
petrav

Нет. Потому что принцип подстановки Лисков. То что вы предложили — это switch от типа объекта. Это нарушение
Знаете ООП паттерн "Посетитель" (Visiter)? Это своего рода свитч в зависимости от типа объекта. То, что привел Анатолий, фактически есть его интерпретация на С++17. А нарушения принципа Барбары там нет, так как не подразумевается, что эти объекты должны быть порождены друг от друга, хотя и могут иметь общего предка.
29 май 21, 22:57    [22328889]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
AmKad
Member

Откуда:
Сообщений: 5297
И даже если рассматриваемые объекты могут быть порождены друг от друга, классический паттерн Visiter от банды четырех (по крайней мере для C++) предполагает отдельный специально именованный метод-обработчик для каждого типа во избежание нарушения этого принципа.
29 май 21, 23:17    [22328890]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
petrav
Member

Откуда:
Сообщений: 2944
AmKad
И даже если рассматриваемые объекты могут быть порождены друг от друга, классический паттерн Visiter от банды четырех (по крайней мере для C++) предполагает отдельный специально именованный метод-обработчик для каждого типа во избежание нарушения этого принципа.

Во-первых не «Visiter», а «Visitor». Во-вторых. Что это за идеология такая: объекты порождены друг от друга? Это что такое?
Эмуляция (имитация) эволюции или что-то другое? Я не очень понимаю о чём вы говорите.

Сообщение было отредактировано: 29 май 21, 23:20
29 май 21, 23:27    [22328892]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
AmKad
Member

Откуда:
Сообщений: 5297
petrav,

Да. Опечатался. Да, для объяснения отношения наследования между классами рассматриваемых объектов мне стоило выразиться корректнее.
29 май 21, 23:36    [22328895]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
petrav
Member

Откуда:
Сообщений: 2944
AmKad
petrav,

Да. Опечатался. Да, для объяснения отношения наследования между классами рассматриваемых объектов мне стоило выразиться корректнее.

Отлично. Я даже больше скажу. Паттерн «Visitor (Посетитель)» — это костыль. Вынужденная мера, когда наша (или чужая)
иерархия классов настолько сложна, что блин, легче прикрутить некоего пофигичного посетителя, который что-то за нас решит.
Но, да, пожертвовав принципами ООП.
29 май 21, 23:47    [22328897]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
AmKad
Member

Откуда:
Сообщений: 5297
petrav
Паттерн «Visitor (Посетитель)» — это костыль.
Мотивация применения этого паттерна в том, что вы хотите вынести (в общем случае полиморфный) обработчик из кода классов одной иерархии или компонента в отдельный интерфейс.
29 май 21, 23:52    [22328898]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
petrav
Member

Откуда:
Сообщений: 2944
AmKad
petrav
Паттерн «Visitor (Посетитель)» — это костыль.
Мотивация применения этого паттерна в том, что вы хотите вынести (в общем случае полиморфный) обработчик из кода классов одной иерархии или компонента в отдельный интерфейс.

Ну, плиз, приведите простейший пример зачем это нужно. Ну я думаю это не займёт больше двадцати строчек?
29 май 21, 23:56    [22328899]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
AmKad
Member

Откуда:
Сообщений: 5297
petrav
Ну, плиз, приведите простейший пример зачем это нужно. Ну я думаю это не займёт больше двадцати строчек?
Имеется иерархия объектов игрового мира. Требуется сделать ее обход обработчиками-визитерами. Добавление новой реализации визитера не должно приводить к необходимости изменения (и в лучшем случае к перекомпиляции) иерархии.

Реализации визитеров:
Рендереры:
- openGLES-рендерер;
- Vulkan-рендерер;
- Metal-рендерер;
Регистраторы объектов (при создании 2D-мира):
- В интерфейсе Box2D;
- В интерфейсе Chipmunk2D.

Все визитеры релизуют один и тот же интерфейс.

P.S. Поэкспериментировал с std::variant, засунув туда классы Base, Derived и объект класса Standalone вне иерархии. Нарушить принцип Liskov мне не удалось. А Вам?
30 май 21, 00:27    [22328904]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
petrav
Member

Откуда:
Сообщений: 2944
AmKad

P.S. Поэкспериментировал с std::variant, засунув туда классы Base, Derived и объект класса Standalone вне иерархии. Нарушить принцип Liskov мне не удалось. А Вам?

Я Вас попросил привести простой и наглядный пример про паттерн Посетитель. Просто 20-30 строчек простейшего кода.

А что я получил? Какие-то рассуждения про OpenGL, Metal и Вулкан? Я должен в них разобраться? Я прошу Вас привести
простой и наглядный пример нужности паттерна Посетитель. Лучше что бы он не нарушал принципы SOLID.
30 май 21, 00:35    [22328905]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
petrav
Member

Откуда:
Сообщений: 2944
AmKad,

При этом я не иронизирую. Мне действительно интересно ваше решение.
30 май 21, 00:37    [22328906]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
AmKad
Member

Откуда:
Сообщений: 5297
petrav,

Я утомился. Забудьте.
30 май 21, 00:45    [22328908]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
petrav
Member

Откуда:
Сообщений: 2944
AmKad
petrav,

Я утомился. Забудьте.

:) Ну ничего страшного. Завтра будет новый день, Вы отдохнёте и может мы продолжим разговор
про супер паттерн Посетитель. :)
30 май 21, 01:27    [22328910]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6658
petrav,

Если из примеров выше не понятно почему visit аналог именно полиморфизма, а не switch то вот вам попроще пример.

struct A {
    void run() { }
};
struct B {
    void run() { }
};

int main()
{
    std::variant<A, B> v;
    std::visit([](auto& n){ n.run(); }, v);
}
30 май 21, 10:28    [22328930]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Anatoly Moskovsky,
Прикольно. Полиморфизм с абсолютно несвязанными типами.
Этакое безалкагольное пиво))))
30 май 21, 11:07    [22328937]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
PetroNotC Sharp
Anatoly Moskovsky
пропущено...


SChildFirst* child = dynamic_cast<ChildFirst*>(v);

// cannot convert from unique ptr



Если речь про эту ошибку то - так:
ChildFirst* child = dynamic_cast<ChildFirst*>(v.get());
if (child) {
   //  ChildFirst
}
else {
  // other class
}

спасибо. Ты волшебник)
дайте пожалуйста совет для С++11
Ну или подскажите как студию перключить на С++11 и я буду копать как решить мою проблему.
31 май 21, 11:20    [22329195]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Siemargl
PetroNotC Sharp,

Ну ты то умнее IDE... Или нет?
насчет умности ide.
Я шаблоны не писал ещё)
В студии параметр функции IDE! показывает как
const std::unique_ptr<BaseMy> &x

В Qt
const BaseMy &x
BaseMy &&x

Это где прописано что в зависимости от версии компилятора тип ссылки меняется? В шаблоне?
31 май 21, 11:50    [22329213]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51389
PetroNotC Sharp
Anatoly Moskovsky,
Прикольно. Полиморфизм с абсолютно несвязанными типами.
Этакое безалкагольное пиво))))

Похоже на параметрический полиморфизм в ФП.
31 май 21, 12:13    [22329233]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
mayton,
Ну, с этип вариантом там и лямды идут. Поэтому да. Недалеко))
Передний край в С++))))
31 май 21, 12:26    [22329249]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Хммм.
Погуглил - нельзя заставить студию работать до С++17.
Только поставить 2008)))
31 май 21, 16:21    [22329412]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
В отношении вопроса почему не работало, отвечаю что сам виноват.
Не обратил внимания что в рабочих примерах наш профи сменил тип входящего в шаблон))
Было
tree <базовыйКласс>
а стало
tree <std:: умныйУказатель на него
)))
Для 11 версии поставил
std::shared_ptr<BaseClass>>

Далее. Я собирался определять что это лист дерева, либо по имени класса либо добавит вирт функцию дайМнеТипУзла.
Но в появившемся динамическом кастинге уже все есть.
if (если null то нет наследника).
Работает.
ЗЫ.
Как переключать студию на раннюю версию C++ вопрос актуальный.
31 май 21, 17:48    [22329461]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5   вперед  Ctrl      все
Все форумы / C++ Ответить