|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, Я же привел пример выше с классом Семья в листьях дерева. Как будем решать? В не листьях требуется только строка адреса Область-Район-Город-.. Тогда базовый класс будет и адресом и семьей? Так что ли? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 18:28 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 18:42 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 18:51 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky PetroNotC Sharp, Зачем вам наследование если наследники не наследуют виртуальные функции? Лучше используйте std::vaiant с обычными значениями и не морочьте себе голову. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
Анатолий, а зачем вы здесь применили ссылку на rvalue (если я правильно выразился)? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 20:15 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
petrav Анатолий, а зачем вы здесь применили ссылку на rvalue (если я правильно выразился)? Это идиоматический код, подходящий для любых ситуаций. В данном случае это универсальная(universal/forwarding) ссылка (т.к. auto создает контекс вывода типа, как в шаблонах). В зависимости от результата * итератора она станет либо rvalue либо lvalue ссылкой. В случае если *it это не ссылка, а значение - это полезное свойство, так как auto& не примет такое значение, а просто auto может быть дорого. Так что в generic коде - самое оно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 21:35 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Странно что это нельзя сделать в плюсах) 22328546 Если есть наследование, то выше вам уже написали - dynamic_cast решает эту же задачу. Но это неверный дизайн если вам надо делать касты. Я уже написал как делать - создать классы на каждый тип узла дерева и перечислить их в variant. А потом при обходе дерева использовать std::visit для выполнения кода специфичного для каждого типа. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 21:41 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Если есть наследование, то выше вам уже написали - dynamic_cast решает эту же задачу. Я же выше написал код с ошибкой. Как убрать ошибку? Anatoly Moskovsky Но это неверный дизайн если вам надо делать касты. давайте сначала уберем ошибку а потом про архитектуру и дизайн. Anatoly Moskovsky Я уже написал как делать - создать классы на каждый тип узла дерева и перечислить их в variant. А потом при обходе дерева использовать std::visit для выполнения кода специфичного для каждого типа. То есть либа выше не предусматривает приведения типа? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 22:00 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Anatoly Moskovsky, Я же привел пример выше с классом Семья в листьях дерева. Как будем решать? В не листьях требуется только строка адреса Область-Район-Город-.. Тогда базовый класс будет и адресом и семьей? Так что ли? Но вообще, не понимаю в чем у тебя проблема то? Ну сделай себе вместо дерева матрешку. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
А потом добавляй в эти классы объединяющие методы например: Код: plaintext 1. 2. 3.
По существу это тоже самое дерево, но на каждой высоте у тебя будет именованный класс. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 22:20 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Я же выше написал код с ошибкой. Как убрать ошибку? Код: plaintext 1. 2. 3.
Если речь про эту ошибку то - так: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 22:21 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky PetroNotC Sharp Я же выше написал код с ошибкой. Как убрать ошибку? Код: plaintext 1. 2. 3.
Если речь про эту ошибку то - так: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 22:35 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
White Owl, - методы Семьи только в наследнике. А он в листьях дерева. В остальных ОДИН виртуальный метод getNodeName() - там типа адрес или район или область. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 22:37 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
White Owl По существу это тоже самое дерево, но на каждой высоте у тебя будет именованный класс. нельзя. Это классификатор. Там все может менятся. Там не нужна строгая типизация и строгие классы. Например, может быть "два раза город" и т.д. То есть это чел сам строит дерево и добавляет строки прямо в узел дерева. Главный класс это листья дерева. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 22:43 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
White Owl, То что каждая мапа это в принципе дерево я согласен)). Но бывает удобно настоящее дерево. С плюшками (итератор обхода всего дерева\обхода одного уровня, методы добавления и рекурсии, перемещения нод и т.д.) http://stlplus.sourceforge.net/stlplus3/docs/ntree.html ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 22:49 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, std::variant это c++17, а топик хочет 11 и доку не читать =) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 00:01 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Siemargl, В Бусте есть и для 11 )) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 10:50 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Да. Желательно С++11. Имхо буст ставить как то монструозно. Ну а к самому типу вариант я как то отношусь с осторожностью. Очень люблю жесткую типизацию. Чтобы все под контролем) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 12:30 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, Ничего монструозного в Бусте нет. variant - это и есть жесткая типизация. Например если в std::visit передать перегрузки не для всех типов то просто не откомпилируется. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 16:09 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, >variant - это и есть жесткая типизация. = Variant — это специальный тип данных, который может содержать любой вид данных Тут имхо вопрос двоякий tree<типизацияПолиморфная> Или tree<типизацияТипаВариант> Что лучше надо смотреть. Опыта такого у меня нет. ... Я выше сказал что мне лично неудобно по многим критериям а не именно variant. У меня Qt C++11 Для установки буст нужно разрешения заказчика. Я этот буст вообще не юзал. Мне бы в умных указателях разобраться. А вот дерево выше из одного файла заголовка вообще идеально. Будет у меня 17я с удовольствием посмотрю tree variant. Спасибо за ваш пример! ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 16:51 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky PetroNotC Sharp, Ничего монструозного в Бусте нет. variant - это и есть жесткая типизация. Например если в std::visit передать перегрузки не для всех типов то просто не откомпилируется. Э... std::variant — это всё же нарушение всех базовых принципов ООП. Эти перегрузки — это прямой аналог оператора switch от типа объекта. Цель полиморфизма как раз и была отходом от этого switch. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 17:37 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
petrav Эти перегрузки — это прямой аналог оператора switch от типа объекта. В отличие от switch, variant не дает пропустить обработку типов. Это принципиальная разница. Так что это и близко не аналог switch. По решаемой задаче это как раз аналог полиморфизма с абстрактными методами, которые подтипы должны реализовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 18:18 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
petrav Цель полиморфизма как раз и была отходом от этого switch. Цель топика не полиморфизм в чистом виде. При полиморфном объекте НЕ виртуальные методы не вызываются. А мне нужно вызвать и меть реально разные классы. В принципе нужно и то и то. И метод один на всех getTextNode() и вызвать особенности индивидуального класса. Это не классика полиморфизма с его методом Draw() ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 18:28 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
При этом ты упомянул Дельфи с её классикой полиморфизма в виде всеобщего предка TObject и его методов ClassName и т.д. и т.п. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 18:38 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov При этом ты упомянул Дельфи с её классикой полиморфизма в виде всеобщего предка TObject и его методов ClassName и т.д. и т.п. А TObject как базовый класс это не совсем полиморфизм. В Qt тоже есть базовый класс но полиморфизмом никто не зовет. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 18:55 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC Sharpя упомянул tag и data pointer который есть везде (шарпе и дельфи). И что тебе мешает в своём дереве иметь uintptr_t tag и void* data для каждой ноды? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 19:01 |
|
|
start [/forum/topic.php?fid=57&msg=40073968&tid=2017202]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
61ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
others: | 243ms |
total: | 423ms |
0 / 0 |