powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Tree + полиморфный. Как кастовать в наследника?
25 сообщений из 108, страница 3 из 5
Tree + полиморфный. Как кастовать в наследника?
    #40074072
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
void* data

в обычных деревьях и ЯП высокого уровня в дереве на каждой ноде void* data - дополнительное поле.
Я этой либе я такого не увидел.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074074
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC SharpИли работает как раньше?

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

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

Тут ты явно хотел сказать "в каждой Дельфи", поскольку шарп позаимствовал оттуда VCL чуть менее чем полностью.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074079
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
В принципе мне деструкторы и нужны ручные. Автоматические сильно жизнь портили в COM когда то.
Убираем дерево и очищаем data вручную.
...
Ну дак все заимствуют хорошее. Поле данных прицепом везде приятно и везде есть.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074103
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
petrav
Эти перегрузки — это прямой
аналог оператора switch от типа объекта.

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

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

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

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

Нет. Потому что принцип подстановки Лисков. То что вы предложили — это switch от типа объекта. Это нарушение
принципов ООП. ИМХО. :)
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074105
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,
У ООП всего три принципа. Какое нарушено?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074107
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav

Нет. Потому что принцип подстановки Лисков. То что вы предложили — это switch от типа объекта. Это нарушение
Знаете ООП паттерн "Посетитель" (Visiter)? Это своего рода свитч в зависимости от типа объекта. То, что привел Анатолий, фактически есть его интерпретация на С++17. А нарушения принципа Барбары там нет, так как не подразумевается, что эти объекты должны быть порождены друг от друга, хотя и могут иметь общего предка.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074108
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И даже если рассматриваемые объекты могут быть порождены друг от друга, классический паттерн Visiter от банды четырех (по крайней мере для C++) предполагает отдельный специально именованный метод-обработчик для каждого типа во избежание нарушения этого принципа.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074110
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
И даже если рассматриваемые объекты могут быть порождены друг от друга, классический паттерн Visiter от банды четырех (по крайней мере для C++) предполагает отдельный специально именованный метод-обработчик для каждого типа во избежание нарушения этого принципа.

Во-первых не «Visiter», а «Visitor». Во-вторых. Что это за идеология такая: объекты порождены друг от друга? Это что такое?
Эмуляция (имитация) эволюции или что-то другое? Я не очень понимаю о чём вы говорите.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074113
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

Да. Опечатался. Да, для объяснения отношения наследования между классами рассматриваемых объектов мне стоило выразиться корректнее.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074115
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
petrav,

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

Отлично. Я даже больше скажу. Паттерн «Visitor (Посетитель)» — это костыль. Вынужденная мера, когда наша (или чужая)
иерархия классов настолько сложна, что блин, легче прикрутить некоего пофигичного посетителя, который что-то за нас решит.
Но, да, пожертвовав принципами ООП.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074116
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Паттерн «Visitor (Посетитель)» — это костыль.
Мотивация применения этого паттерна в том, что вы хотите вынести (в общем случае полиморфный) обработчик из кода классов одной иерархии или компонента в отдельный интерфейс.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074117
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
petrav
Паттерн «Visitor (Посетитель)» — это костыль.
Мотивация применения этого паттерна в том, что вы хотите вынести (в общем случае полиморфный) обработчик из кода классов одной иерархии или компонента в отдельный интерфейс.

Ну, плиз, приведите простейший пример зачем это нужно. Ну я думаю это не займёт больше двадцати строчек?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074122
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Ну, плиз, приведите простейший пример зачем это нужно. Ну я думаю это не займёт больше двадцати строчек?
Имеется иерархия объектов игрового мира . Требуется сделать ее обход обработчиками-визитерами. Добавление новой реализации визитера не должно приводить к необходимости изменения (и в лучшем случае к перекомпиляции) иерархии.

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

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

P.S. Поэкспериментировал с std::variant, засунув туда классы Base, Derived и объект класса Standalone вне иерархии. Нарушить принцип Liskov мне не удалось. А Вам?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074123
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad

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

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

А что я получил? Какие-то рассуждения про OpenGL, Metal и Вулкан? Я должен в них разобраться? Я прошу Вас привести
простой и наглядный пример нужности паттерна Посетитель. Лучше что бы он не нарушал принципы SOLID.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074124
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

При этом я не иронизирую. Мне действительно интересно ваше решение.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074126
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

Я утомился. Забудьте.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074128
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
petrav,

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

:) Ну ничего страшного. Завтра будет новый день, Вы отдохнёте и может мы продолжим разговор
про супер паттерн Посетитель. :)
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074141
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
struct A {
    void run() { }
};
struct B {
    void run() { }
};

int main()
{
    std::variant<A, B> v;
    std::visit([](auto& n){ n.run(); }, v);
}
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074146
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
Прикольно. Полиморфизм с абсолютно несвязанными типами.
Этакое безалкагольное пиво))))
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074308
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Anatoly Moskovsky
пропущено...


Код: plaintext
1.
2.
3.
SChildFirst* child = dynamic_cast<ChildFirst*>(v);

// cannot convert from unique ptr




Если речь про эту ошибку то - так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ChildFirst* child = dynamic_cast<ChildFirst*>(v.get());
if (child) {
   //  ChildFirst
}
else {
  // other class
}


спасибо. Ты волшебник)
дайте пожалуйста совет для С++11
Ну или подскажите как студию перключить на С++11 и я буду копать как решить мою проблему.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074316
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl
PetroNotC Sharp,

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


В Qt
Код: plaintext
1.
2.
const BaseMy &x
BaseMy &&x


Это где прописано что в зависимости от версии компилятора тип ссылки меняется? В шаблоне?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074325
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Anatoly Moskovsky,
Прикольно. Полиморфизм с абсолютно несвязанными типами.
Этакое безалкагольное пиво))))

Похоже на параметрический полиморфизм в ФП.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074335
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Ну, с этип вариантом там и лямды идут. Поэтому да. Недалеко))
Передний край в С++))))
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074432
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хммм.
Погуглил - нельзя заставить студию работать до С++17.
Только поставить 2008)))
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074471
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В отношении вопроса почему не работало, отвечаю что сам виноват.
Не обратил внимания что в рабочих примерах наш профи сменил тип входящего в шаблон))
Было
tree <базовыйКласс>
а стало
tree <std:: умныйУказатель на него
)))
Для 11 версии поставил
Код: plaintext
1.
std::shared_ptr<BaseClass>>


Далее. Я собирался определять что это лист дерева, либо по имени класса либо добавит вирт функцию дайМнеТипУзла.
Но в появившемся динамическом кастинге уже все есть.
if (если null то нет наследника).
Работает.
ЗЫ.
Как переключать студию на раннюю версию C++ вопрос актуальный.
...
Рейтинг: 0 / 0
25 сообщений из 108, страница 3 из 5
Форумы / C++ [игнор отключен] [закрыт для гостей] / Tree + полиморфный. Как кастовать в наследника?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]