|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Есть либа из одного заголовка tree.h https://github.com/kpeeters/tree.hh Все работает и мне удалось загнать в node полиморфный объект и прочитать. Не удалось кастовать базовый класс к наследнику. Это код при записи в node string Код: plaintext 1. 2. 3. 4. 5.
При записи вместо string базового класса и наследника, я получаю базовый так: MyBase base = *sib; Как кастовать в наследника его? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2021, 20:03 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Попутный вопрос. Как работает поиск node в итераторе если ищется не строка а поле класса? Сейчас при смене типа у меня find не компилится loc=find(tr.begin(), tr.end(), "two"); ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2021, 20:07 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Доп.вопрос. Почему cout << typeid(base).name() << endl; Не выводит имя MyBase, а выводит.. (по памяти) 74namespaceMyBase12345 )) компа нет под рукой)) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2021, 20:14 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, Кастовать в наследника не нужно. Для этого придумали виртуальные методы ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2021, 21:15 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Siemargl PetroNotC Sharp, Кастовать в наследника не нужно. Для этого придумали виртуальные методы Я бы за. Но не вижу специфических методов наследника в IDE. Они только у наследника. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2021, 21:59 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, Ну ты то умнее IDE... Или нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2021, 23:06 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, Вот, о чем тебе говорил Siemargl Код: 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.
Код: plaintext 1. 2. 3.
PetroNotC Sharp Попутный вопрос. Как работает поиск node в итераторе если ищется не строка а поле класса? Сейчас при смене типа у меня find не компилится loc=find(tr.begin(), tr.end(), "two"); ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 01:06 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad, Спасибо. Круто. Выше писал что мне нужен НЕ виртуальный метод в наследнике. Вызов виртуального у меня работает. Там приведение типов не нужно. Возможно все дело в том что я вместо mTree.insert(... std::make_unique<ChildFirst>()); по аналогии со строкой mTree.insert(... "abc" ); Делал mTree.insert(... ChildFirst(123, "abc") ); Умных указателей развелось. Доберусь до компа попробую. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 06:57 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Siemargl PetroNotC Sharp, Ну ты то умнее IDE... Или нет? Я к IDE отношусь с богопочтением.)) Мне нужно после точки подсказка по кастованному объекту. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 06:59 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
авторИспользуя информацию о типах во время выполнения, можно проверить, указывает ли указатель на полный объект и можно ли безопасно выполнить приведение этого указателя, чтобы он указывал на другой объект в своей иерархии. Для выполнения этих типов приведений можно использовать оператор dynamic_cast Вот у меня это не выходило, возможно из за статической инициализации без оператора new объекта. std::make_unique не приходилось использовать ни разу. Каюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 07:22 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad, Блин))) у меня с++11 Пробовать оператор new? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 10:07 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad, Можно пример для с11? Ни shared_ptr, ни unique_ptr, ни new не работают. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 10:31 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Доп.вопрос. Почему cout << typeid(base).name() << endl; Не выводит имя MyBase, а выводит.. (по памяти) 74namespaceMyBase12345 )) компа нет под рукой)) N5my15my213ClassMyE Для namespace my1{ namespace my2{ class ClassMy ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 10:43 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Возможно все дело в том что я вместо mTree.insert(... std::make_unique<ChildFirst>()); по аналогии со строкой mTree.insert(... "abc" ); Делал mTree.insert(... ChildFirst(123, "abc") ); Умных указателей развелось. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 11:01 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad, Пробовал. Не выходит. (( А с pointer = new class не берет сама либа ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 11:12 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Пробовал. Не выходит. (( ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 11:15 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad, Главное, со статической инициализацией все работает. И я так понял потом кастовать в наш указатель уже поздно что ли? Я вообще на либу подумал. Но потом все заработало кроме получения полного класса из базового. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 11:15 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad PetroNotC Sharp Пробовал. Не выходит. (( Спс. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 11:16 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad, Загрузил твой код не в Qt с 11 а в студии Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Дает ошибку cannot convert from unique ptr Как исправить? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 15:10 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, Fix лежит на поверхности, но я не дам тебе решения, пока ты не объяснишь какую задачу ты решаешь и для каких целей тебе такая конвертация. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 15:55 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad, Ну, во первых это обычное поле data pointer в деревьях еще со времен дельфи. Во вторых, мне конкретно в листьях дерева нужен класс ЛистДерева с бизнес данными. А выше структура это просто классификатор. Например, в листьях Семья с атрибутами. А дерево это адрес. Или .... Это банальная Модель данных повсюду. Как поле tag в любом vcl объекте. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 16:08 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad, Раньше была Сишная конвертация))) А теперь наворотили из за отсутствия сборщика мусора? (про shared ptr почитал))) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 16:10 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3.
Это шарп ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 16:17 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad, И вообще, чем дерево как коллекция отличается от списка TList? Я же не о полиморфизме счас. Там нельзя наследников держать? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 16:19 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 18:08 |
|
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 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, а топик про другое. Как кастовать на сегодня с умными указателями а не по Сишному скобками как раньше. Или работает как раньше? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 19:10 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov void* data в обычных деревьях и ЯП высокого уровня в дереве на каждой ноде void* data - дополнительное поле. Я этой либе я такого не увидел. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 19:12 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC SharpИли работает как раньше? С умными указателями - нужен общий предок. Иначе деструкторы не сработают. Но в Дельфи, на которую ты ссылаешься, Data - неумный указатель. PS: PetroNotC Sharpв обычных деревьях и ЯП высокого уровня в дереве на каждой ноде void* data - дополнительное поле. Тут ты явно хотел сказать "в каждой Дельфи", поскольку шарп позаимствовал оттуда VCL чуть менее чем полностью. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 19:15 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, В принципе мне деструкторы и нужны ручные. Автоматические сильно жизнь портили в COM когда то. Убираем дерево и очищаем data вручную. ... Ну дак все заимствуют хорошее. Поле данных прицепом везде приятно и везде есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 19:36 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky petrav Эти перегрузки — это прямой аналог оператора switch от типа объекта. В отличие от switch, variant не дает пропустить обработку типов. Это принципиальная разница. Так что это и близко не аналог switch. Да ну? Как же Ваш std::visit не аналог switch, если он выглядит как статический аналог switch? И он им и является. Я уж не говорю про то, что при разработке ООП как раз и хотели отойти от множественных switch по типу объекта разбросанных по всей программе. Вы говорите: не будет компилироваться? Ну так gcc выдаёт варнинг о том что switch не полон по отношению к enum. Блин, какая тут разница, если нарушены основы всех основ? Что там с принципом подстановки Лисков? Anatoly Moskovsky По решаемой задаче это как раз аналог полиморфизма с абстрактными методами, которые подтипы должны реализовать. Нет. Потому что принцип подстановки Лисков. То что вы предложили — это switch от типа объекта. Это нарушение принципов ООП. ИМХО. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 22:28 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
petrav, У ООП всего три принципа. Какое нарушено? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 22:40 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
petrav Нет. Потому что принцип подстановки Лисков. То что вы предложили — это switch от типа объекта. Это нарушение ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 22:57 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
И даже если рассматриваемые объекты могут быть порождены друг от друга, классический паттерн Visiter от банды четырех (по крайней мере для C++) предполагает отдельный специально именованный метод-обработчик для каждого типа во избежание нарушения этого принципа. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 23:17 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad И даже если рассматриваемые объекты могут быть порождены друг от друга, классический паттерн Visiter от банды четырех (по крайней мере для C++) предполагает отдельный специально именованный метод-обработчик для каждого типа во избежание нарушения этого принципа. Во-первых не «Visiter», а «Visitor». Во-вторых. Что это за идеология такая: объекты порождены друг от друга? Это что такое? Эмуляция (имитация) эволюции или что-то другое? Я не очень понимаю о чём вы говорите. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 23:27 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
petrav, Да. Опечатался. Да, для объяснения отношения наследования между классами рассматриваемых объектов мне стоило выразиться корректнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 23:36 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad petrav, Да. Опечатался. Да, для объяснения отношения наследования между классами рассматриваемых объектов мне стоило выразиться корректнее. Отлично. Я даже больше скажу. Паттерн «Visitor (Посетитель)» — это костыль. Вынужденная мера, когда наша (или чужая) иерархия классов настолько сложна, что блин, легче прикрутить некоего пофигичного посетителя, который что-то за нас решит. Но, да, пожертвовав принципами ООП. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 23:47 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
petrav Паттерн «Visitor (Посетитель)» — это костыль. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 23:52 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad petrav Паттерн «Visitor (Посетитель)» — это костыль. Ну, плиз, приведите простейший пример зачем это нужно. Ну я думаю это не займёт больше двадцати строчек? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2021, 23:56 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
petrav Ну, плиз, приведите простейший пример зачем это нужно. Ну я думаю это не займёт больше двадцати строчек? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Все визитеры релизуют один и тот же интерфейс. P.S. Поэкспериментировал с std::variant, засунув туда классы Base, Derived и объект класса Standalone вне иерархии. Нарушить принцип Liskov мне не удалось. А Вам? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2021, 00:27 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad P.S. Поэкспериментировал с std::variant, засунув туда классы Base, Derived и объект класса Standalone вне иерархии. Нарушить принцип Liskov мне не удалось. А Вам? Я Вас попросил привести простой и наглядный пример про паттерн Посетитель. Просто 20-30 строчек простейшего кода. А что я получил? Какие-то рассуждения про OpenGL, Metal и Вулкан? Я должен в них разобраться? Я прошу Вас привести простой и наглядный пример нужности паттерна Посетитель. Лучше что бы он не нарушал принципы SOLID. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2021, 00:35 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad, При этом я не иронизирую. Мне действительно интересно ваше решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2021, 00:37 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
petrav, Я утомился. Забудьте. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2021, 00:45 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad petrav, Я утомился. Забудьте. :) Ну ничего страшного. Завтра будет новый день, Вы отдохнёте и может мы продолжим разговор про супер паттерн Посетитель. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2021, 01:27 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
petrav, Если из примеров выше не понятно почему visit аналог именно полиморфизма, а не switch то вот вам попроще пример. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2021, 10:28 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, Прикольно. Полиморфизм с абсолютно несвязанными типами. Этакое безалкагольное пиво)))) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2021, 11:07 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Anatoly Moskovsky пропущено... Код: plaintext 1. 2. 3.
Если речь про эту ошибку то - так: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Ну или подскажите как студию перключить на С++11 и я буду копать как решить мою проблему. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 11:20 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Siemargl PetroNotC Sharp, Ну ты то умнее IDE... Или нет? Я шаблоны не писал ещё) В студии параметр функции IDE! показывает как Код: plaintext 1.
В Qt Код: plaintext 1. 2.
Это где прописано что в зависимости от версии компилятора тип ссылки меняется? В шаблоне? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 11:50 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Anatoly Moskovsky, Прикольно. Полиморфизм с абсолютно несвязанными типами. Этакое безалкагольное пиво)))) Похоже на параметрический полиморфизм в ФП. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 12:13 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
mayton, Ну, с этип вариантом там и лямды идут. Поэтому да. Недалеко)) Передний край в С++)))) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 12:26 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Хммм. Погуглил - нельзя заставить студию работать до С++17. Только поставить 2008))) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 16:21 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
В отношении вопроса почему не работало, отвечаю что сам виноват. Не обратил внимания что в рабочих примерах наш профи сменил тип входящего в шаблон)) Было tree <базовыйКласс> а стало tree <std:: умныйУказатель на него ))) Для 11 версии поставил Код: plaintext 1.
Далее. Я собирался определять что это лист дерева, либо по имени класса либо добавит вирт функцию дайМнеТипУзла. Но в появившемся динамическом кастинге уже все есть. if (если null то нет наследника). Работает. ЗЫ. Как переключать студию на раннюю версию C++ вопрос актуальный. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 17:48 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Как переключать студию на раннюю версию C++ ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 18:06 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Ну и про умные указатели. Тенденция такая чтобы прогер нигде не писал new ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 18:06 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad PetroNotC Sharp Как переключать студию на раннюю версию C++ Справа Qt не работает. Слева студия и твой код рабочий. Вот из за разницы в версии плюсов я и пошел не туда. Лучше одинаково чтоб было. Ну или переключать как в андроид студии ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 18:09 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, Посмотри где-то тут: project > Properties > C/C++ > Language > C++ Language Standard. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 18:14 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad, ОК завтра ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2021, 18:34 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2021, 09:46 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Короткий вопрос куда копать. Нужна перегрузка метода класса по возврату. Говорят в с++ не поддерживается. Ну или такого типа getPatamInt().toString() Как делается такое или перегрузка? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 16:04 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
И таким людям наше государство зарплату платит... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 16:06 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
petrav И таким людям наше государство зарплату платит... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 16:10 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Алло профи! Сам вопрос не понятен или вы любите новичков в отдельном подфоруме держать? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 18:32 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Ответ: в С++ такое не поддерживается. Можешь заново начинать клоунаду с его неприятием и поиском костылей вместо правки консерватории. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 18:39 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Цепочку методов нельзя создать? obj.f().f2() Ты профи? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 18:47 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC SharpЦепочку методов нельзя создать? Создать можно практически всё что угодно. Назови конечную цель для которой тебе понадобилась перегрузка по возвращаемому значению. Для обычных целей обычно используют перегруженные операторы. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 18:54 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Перегрузка это МЕТОД достижения цели. Цепочка методов - это ВТОРОЙ МЕТОД. Цель - не писать бойлерплейт код с моим классом tree выше. https://ru.stackoverflow.com/questions/583342/Что-такое-boilerplate-code У класса много полей разного типа. Его второе назначение - вывод в эксель полей в строковом виде. Т.е. Экспортер просто должен взять поле как строку. Не верю что ты никогда не встречал такого при работе с бд) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 19:19 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC SharpТ.е. Экспортер просто должен взять поле как строку. Для этого перегружают по типу параметра: Код: sql 1.
Особые эстеты перегружают на стороне полей: Код: sql 1.
Ну а кривизну твоего дерева осуждают с самого начала топика. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 19:28 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, 1. Нельзя. Ты нагрузил экспортера и его надо рефакторить и потом тестировать. Экспортеров несколько. Все будем ломать под дерево.? 2. Не понял как на стороне полей? Опять экспортер? 3. Ты не отвлекайся на кривизну Постановки задачи))) Дак как с цепочкой? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 19:38 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Не бывает такого в плюсах? Не встречал? Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 19:42 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 20:10 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, Круто. Ты волшебник. Попробую. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 20:12 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC SharpЭкспортеров несколько. Все будем ломать под дерево.? А кто ещё кроме них знает как именно экспортировать те или иные типы?.. PetroNotC Sharp2. Не понял как на стороне полей? Опять экспортер? Кто кроме самих полей знает как преобразовать себя в нужный кому-то другому тип?.. PetroNotC SharpДак как с цепочкой? Старый дерьмовый дизайн ещё с эпохи плоского Си. Класса Код: sql 1.
Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 22:19 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, ОК. Ты предложил не мой класс дает в удобном формате а класс забиратель пусть сам преобразовывает. Другие мысли есть или всё? 2. Я просто не понял твой метод 2. Разверни его. 3. Нет. Не получается у тебя. Смотри выше у кого в топике получается с кодом примерами на плюсах и даже 17тых ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2021, 22:39 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
PetroNotC SharpТы предложил не мой класс дает в удобном формате а класс забиратель пусть сам преобразовывает. Нет. Я сказал "преобразование должно происходить там, где есть знание как и во что надо преобразовывать. Это вопрос дизайна, а не кодинга. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2021, 00:32 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Ну, можно и поспорить. У класса есть поведение. А поведение его согласно ТЗ. Это и есть "знание как и во что надо". Насчет того, делать классы тупыми сервисами или умными еще Фаулер спорил. И кстати, к золотой пули не пришли. https://habr.com/ru/post/346016/ Анемичная модель ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2021, 07:07 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Начиная с Qt 5.4 вы также можете писать: qDebug().nospace().noquote() << var1; ) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2021, 11:37 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Нужно при работе с умными указателями обнулять переменную руками? Напр tree<shared ptr.... ptr; for(... ptr = map[key] ; ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 10:39 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Дурдом сделали с этими умными... У меня удаляются ноды в дереве при выходе переменной из области. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 10:52 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky PetroNotC Sharp Я же выше написал код с ошибкой. Как убрать ошибку? Код: plaintext 1. 2. 3.
Если речь про эту ошибку то - так: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Подскажи как правильно брать дерево или кусок дерева на редактирование при shared и при unique ptr? Если нужно владельца нод только само дерево. И это логично. То почему получая дерево, и правя ветки, уничтожаются только ветки? Так дерево некорректно написано? В шаблоне разве не один тип на все веточки ноды? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 11:02 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Это получается либо неправильно беру из мапы, либо в мапу тоже добавлять дерево через умный? Первое или второе? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 11:12 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
Ну и Петруха, развел балаган на 5 страниц. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 11:33 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad, Ну дак подсказывай. Не балагань) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 11:35 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad, Почему счетчик расшаренного указателя не работает и уничтожает объект? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 11:36 |
|
Tree + полиморфный. Как кастовать в наследника?
|
|||
---|---|---|---|
#18+
AmKad, Хмммм Решил))) Надо было адрес брать и присваивать после того как отдали объект в мапу))). Вам бы отдельный топик для новичков. Изверги)) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 11:49 |
|
|
start [/forum/topic.php?all=1&fid=57&tid=2017202]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
88ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 188ms |
0 / 0 |