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

Откуда:
Сообщений: 8256
Есть либа из одного заголовка tree.h
https://github.com/kpeeters/tree.hh
Все работает и мне удалось загнать в node полиморфный объект и прочитать.
Не удалось кастовать базовый класс к наследнику.
Это код при записи в node string
tree<string>::sibling_iterator sib=tr.begin(loc);
   while(sib!=tr.end(loc)) {
     cout << (*sib) << endl;
     ++sib;
     }

При записи вместо string базового класса и наследника, я получаю базовый так:
MyBase base = *sib;
Как кастовать в наследника его?
27 май 21, 20:03    [22328187]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Попутный вопрос.
Как работает поиск node в итераторе если ищется не строка а поле класса?
Сейчас при смене типа у меня find не компилится
loc=find(tr.begin(), tr.end(), "two");
27 май 21, 20:07    [22328189]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Доп.вопрос.
Почему
cout << typeid(base).name() << endl;
Не выводит имя MyBase, а выводит.. (по памяти)
74namespaceMyBase12345
)) компа нет под рукой))
27 май 21, 20:14    [22328197]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Siemargl
Member

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

Кастовать в наследника не нужно. Для этого придумали виртуальные методы
27 май 21, 21:15    [22328236]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

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

Кастовать в наследника не нужно. Для этого придумали виртуальные методы

Я бы за. Но не вижу специфических методов наследника в IDE.
Они только у наследника.
27 май 21, 21:59    [22328247]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Siemargl
Member

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

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

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

+ Вот, о чем тебе говорил Siemargl
#include <string>
#include "tree.hh"
#include <iostream>
#include <memory>

class Base {
public:
    virtual void Serialize(std::ostream& os) const = 0;
    virtual ~Base() {}
};

auto getTree() {
    class ChildFirst :  public Base { virtual void Serialize(std::ostream& os) const { os << "First"  << std::endl; }; };
    class ChildSecond : public Base { virtual void Serialize(std::ostream& os) const { os << "Second" << std::endl; }; };
    class ChildThird :  public Base { virtual void Serialize(std::ostream& os) const { os << "Third"  << std::endl; }; };
    tree<std::unique_ptr<Base>> mTree;

    mTree.insert(mTree.begin(), std::make_unique<ChildFirst>());
    mTree.insert(mTree.begin(), std::make_unique<ChildThird>());
    mTree.insert(mTree.begin(), std::make_unique<ChildSecond>());

    return mTree;
}

int main() {
    const auto mTree = getTree();
    for (const auto& v : mTree) {
        v->Serialize(std::cout);
    }
    return 0;
}

Second
Third
First

PetroNotC Sharp
Попутный вопрос.
Как работает поиск node в итераторе если ищется не строка а поле класса?
Сейчас при смене типа у меня find не компилится
loc=find(tr.begin(), tr.end(), "two");
std::find_if
28 май 21, 01:06    [22328281]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
AmKad,
Спасибо. Круто.
Выше писал что мне нужен НЕ виртуальный метод в наследнике.
Вызов виртуального у меня работает. Там приведение типов не нужно.
Возможно все дело в том что я вместо
mTree.insert(... std::make_unique<ChildFirst>());
по аналогии со строкой
mTree.insert(... "abc" );
Делал
mTree.insert(... ChildFirst(123, "abc") );
Умных указателей развелось.
Доберусь до компа попробую.
28 май 21, 06:57    [22328297]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

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

Ну ты то умнее IDE... Или нет?
не)))))
Я к IDE отношусь с богопочтением.))
Мне нужно после точки подсказка по кастованному объекту.
28 май 21, 06:59    [22328299]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
автор
Используя информацию о типах во время выполнения, можно проверить, указывает ли указатель на полный объект и можно ли безопасно выполнить приведение этого указателя, чтобы он указывал на другой объект в своей иерархии. Для выполнения этих типов приведений можно использовать оператор dynamic_cast

Вот у меня это не выходило, возможно из за статической инициализации без оператора new объекта.
std::make_unique не приходилось использовать ни разу. Каюсь.
28 май 21, 07:22    [22328305]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
AmKad,
Блин))) у меня с++11
Пробовать оператор new?
28 май 21, 10:07    [22328344]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
AmKad,
Можно пример для с11?
Ни shared_ptr, ни unique_ptr, ни new не работают.
28 май 21, 10:31    [22328352]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
PetroNotC Sharp
Доп.вопрос.
Почему
cout << typeid(base).name() << endl;
Не выводит имя MyBase, а выводит.. (по памяти)
74namespaceMyBase12345
)) компа нет под рукой))
пишет так
N5my15my213ClassMyE
Для
namespace my1{
namespace my2{
class ClassMy
28 май 21, 10:43    [22328358]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
AmKad
Member

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

Возможно все дело в том что я вместо
mTree.insert(... std::make_unique<ChildFirst>());
по аналогии со строкой
mTree.insert(... "abc" );
Делал
mTree.insert(... ChildFirst(123, "abc") );
Умных указателей развелось.
Указатель на тип базового класса нужен для вызова виртуальных (полиморфных) методов объектов дочерних классов. Умный он или не очень - в данном контексте не так важно. make_unique появился в C++14, но и до него в C+11 была возможность инициализации умного указателя, правда, в чуть более длинной форме.
28 май 21, 11:01    [22328371]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
AmKad,
Пробовал. Не выходит. ((
А с pointer = new class не берет сама либа
28 май 21, 11:12    [22328381]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
AmKad
Member

Откуда:
Сообщений: 5297
PetroNotC Sharp
Пробовал. Не выходит. ((
Ошибка в 17-ой строке.
28 май 21, 11:15    [22328382]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
AmKad,
Главное, со статической инициализацией все работает. И я так понял потом кастовать в наш указатель уже поздно что ли?
Я вообще на либу подумал.
Но потом все заработало кроме получения полного класса из базового.
28 май 21, 11:15    [22328383]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
AmKad
PetroNotC Sharp
Пробовал. Не выходит. ((
Ошибка в 17-ой строке.
ОК чуть позже все перепроверю.
Спс.
28 май 21, 11:16    [22328384]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
AmKad,
Загрузил твой код не в Qt с 11 а в студии
int main() {
    const auto mTree = getTree();
    for (const auto& v : mTree) {
        v->Serialize(std::cout);
  SChildFirst* child = dynamic_cast<ChildFirst*>(v);
         child->f();
    }
    return 0;
}

Дает ошибку cannot convert from unique ptr
Как исправить?
28 май 21, 15:10    [22328494]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
AmKad
Member

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

Fix лежит на поверхности, но я не дам тебе решения, пока ты не объяснишь какую задачу ты решаешь и для каких целей тебе такая конвертация.
28 май 21, 15:55    [22328532]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
AmKad,
Ну, во первых это обычное поле data pointer в деревьях еще со времен дельфи.
Во вторых, мне конкретно в листьях дерева нужен класс ЛистДерева с бизнес данными.
А выше структура это просто классификатор.
Например, в листьях Семья с атрибутами. А дерево это адрес.
Или
....
Это банальная Модель данных повсюду.
Как поле tag в любом vcl объекте.
28 май 21, 16:08    [22328543]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
AmKad,
Раньше была Сишная конвертация)))
А теперь наворотили из за отсутствия сборщика мусора?
(про shared ptr почитал)))
28 май 21, 16:10    [22328544]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
foreach (var node in tree.nodes) {
    node.Tag as ClassY).functionX()
} 

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

Откуда:
Сообщений: 8256
AmKad,
И вообще, чем дерево как коллекция отличается от списка TList?
Я же не о полиморфизме счас.
Там нельзя наследников держать?

Сообщение было отредактировано: 28 май 21, 16:11
28 май 21, 16:19    [22328548]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Anatoly Moskovsky
Member

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

Зачем вам наследование если наследники не наследуют виртуальные функции?

Лучше используйте std::vaiant с обычными значениями и не морочьте себе голову.

#include <variant>

struct A {
    void run1() { LOG_TRACE("a"); }
};
struct B {
    void run2() { LOG_TRACE("b");}
};

using Value = std::variant<A, B>;

int main()
{
    tree<Value> tree;
    auto a = tree.insert(tree.begin(), A{});
    tree.append_child(a, B{});
    for (auto&& n: tree) {
        struct Visitor {
            void operator()(A& a)
            {
                a.run1();
            }
            void operator()(B& b)
            {
                b.run2();
            }
        };
        std::visit(Visitor{}, n);
    }
    return 0;
}
28 май 21, 18:08    [22328592]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Anatoly Moskovsky,
Я же привел пример выше с классом Семья в листьях дерева.
Как будем решать?
В не листьях требуется только строка адреса Область-Район-Город-..
Тогда базовый класс будет и адресом и семьей? Так что ли?
28 май 21, 18:28    [22328612]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Anatoly Moskovsky,
Странно что это нельзя сделать в плюсах)
22328546
28 май 21, 18:42    [22328620]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Anatoly Moskovsky,
Это как реализуете?
Картинка с другого сайта.
28 май 21, 18:51    [22328626]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
petrav
Member

Откуда:
Сообщений: 2944
Anatoly Moskovsky
PetroNotC Sharp,

Зачем вам наследование если наследники не наследуют виртуальные функции?

Лучше используйте std::vaiant с обычными значениями и не морочьте себе голову.

#include <variant>

struct A {
    void run1() { LOG_TRACE("a"); }
};
struct B {
    void run2() { LOG_TRACE("b");}
};

using Value = std::variant<A, B>;

int main()
{
    tree<Value> tree;
    auto a = tree.insert(tree.begin(), A{});
    tree.append_child(a, B{});
    for (auto&& n: tree) {
        struct Visitor {
            void operator()(A& a)
            {
                a.run1();
            }
            void operator()(B& b)
            {
                b.run2();
            }
        };
        std::visit(Visitor{}, n);
    }
    return 0;
}

Анатолий, а зачем вы здесь применили ссылку на rvalue (если я правильно выразился)?
28 май 21, 20:15    [22328664]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6658
petrav
Анатолий, а зачем вы здесь применили ссылку на rvalue (если я правильно выразился)?

Это идиоматический код, подходящий для любых ситуаций.
В данном случае это универсальная(universal/forwarding) ссылка (т.к. auto создает контекс вывода типа, как в шаблонах).
В зависимости от результата * итератора она станет либо rvalue либо lvalue ссылкой.
В случае если *it это не ссылка, а значение - это полезное свойство, так как auto& не примет такое значение, а просто auto может быть дорого.
Так что в generic коде - самое оно.
28 май 21, 21:35    [22328685]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6658
PetroNotC Sharp
Странно что это нельзя сделать в плюсах)
22328546

Если есть наследование, то выше вам уже написали - dynamic_cast решает эту же задачу.

Но это неверный дизайн если вам надо делать касты.

Я уже написал как делать - создать классы на каждый тип узла дерева и перечислить их в variant.
А потом при обходе дерева использовать std::visit для выполнения кода специфичного для каждого типа.
28 май 21, 21:41    [22328687]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Anatoly Moskovsky
Если есть наследование, то выше вам уже написали - dynamic_cast решает эту же задачу.

Я же выше написал код с ошибкой. Как убрать ошибку?

Anatoly Moskovsky
Но это неверный дизайн если вам надо делать касты.

давайте сначала уберем ошибку а потом про архитектуру и дизайн.

Anatoly Moskovsky
Я уже написал как делать - создать классы на каждый тип узла дерева и перечислить их в variant.
А потом при обходе дерева использовать std::visit для выполнения кода специфичного для каждого типа.

То есть либа выше не предусматривает приведения типа?
28 май 21, 22:00    [22328697]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
White Owl
Member

Откуда:
Сообщений: 12733
PetroNotC Sharp
Anatoly Moskovsky,
Я же привел пример выше с классом Семья в листьях дерева.
Как будем решать?
В не листьях требуется только строка адреса Область-Район-Город-..
Тогда базовый класс будет и адресом и семьей? Так что ли?
А зачем тогда в ветках (на уровне Область-Район-Город) методы для листьев (Семьи)?

Но вообще, не понимаю в чем у тебя проблема то?
Ну сделай себе вместо дерева матрешку.
class Family;
class City {
   vector<Family> families;
};
class Area {
   vector<City> cities;
};
class Region {
  vector<Area> areas;
};
А потом добавляй в эти классы объединяющие методы например:
City::dinnerTime() { 
  for_each (families.begin(), families.end(), [](Family f){f.eat();});
}
По существу это тоже самое дерево, но на каждой высоте у тебя будет именованный класс.
28 май 21, 22:20    [22328701]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6658
PetroNotC Sharp
Я же выше написал код с ошибкой. Как убрать ошибку?


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

// cannot convert from unique ptr

Если речь про эту ошибку то - так:
ChildFirst* child = dynamic_cast<ChildFirst*>(v.get());
if (child) {
   //  ChildFirst
}
else {
  // other class
}
28 май 21, 22:21    [22328702]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Anatoly Moskovsky
PetroNotC Sharp
Я же выше написал код с ошибкой. Как убрать ошибку?


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

// cannot convert from unique ptr


Если речь про эту ошибку то - так:
ChildFirst* child = dynamic_cast<ChildFirst*>(v.get());
if (child) {
   //  ChildFirst
}
else {
  // other class
}
спасибо. Ты волшебник)
28 май 21, 22:35    [22328704]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
White Owl,
- методы Семьи только в наследнике. А он в листьях дерева.
В остальных ОДИН виртуальный метод
getNodeName() - там типа адрес или район или область.

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

Откуда:
Сообщений: 8256
White Owl
По существу это тоже самое дерево, но на каждой высоте у тебя будет именованный класс.

нельзя. Это классификатор. Там все может менятся. Там не нужна строгая типизация и строгие классы.
Например, может быть "два раза город" и т.д.
То есть это чел сам строит дерево и добавляет строки прямо в узел дерева.
Главный класс это листья дерева.
28 май 21, 22:43    [22328707]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
White Owl,
То что каждая мапа это в принципе дерево я согласен)).
Но бывает удобно настоящее дерево.
С плюшками (итератор обхода всего дерева\обхода одного уровня, методы добавления и рекурсии, перемещения нод и т.д.)
http://stlplus.sourceforge.net/stlplus3/docs/ntree.html
28 май 21, 22:49    [22328708]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6493
Anatoly Moskovsky,

std::variant это c++17, а топик хочет 11 и доку не читать =)

Сообщение было отредактировано: 28 май 21, 23:53
29 май 21, 00:01    [22328719]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Anatoly Moskovsky
Member

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

В Бусте есть и для 11 ))
29 май 21, 10:50    [22328750]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Да. Желательно С++11.
Имхо буст ставить как то монструозно.
Ну а к самому типу вариант я как то отношусь с осторожностью.
Очень люблю жесткую типизацию. Чтобы все под контролем)
29 май 21, 12:30    [22328760]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Anatoly Moskovsky
Member

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

Ничего монструозного в Бусте нет.

variant - это и есть жесткая типизация.
Например если в std::visit передать перегрузки не для всех типов то просто не откомпилируется.
29 май 21, 16:09    [22328799]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Anatoly Moskovsky,
>variant - это и есть жесткая типизация.
= Variant — это специальный тип данных, который может содержать любой вид данных
Тут имхо вопрос двоякий
tree<типизацияПолиморфная>
Или
tree<типизацияТипаВариант>
Что лучше надо смотреть. Опыта такого у меня нет.
...
Я выше сказал что мне лично неудобно по многим критериям а не именно variant.
У меня Qt C++11
Для установки буст нужно разрешения заказчика.
Я этот буст вообще не юзал. Мне бы в умных указателях разобраться.
А вот дерево выше из одного файла заголовка вообще идеально.
Будет у меня 17я с удовольствием посмотрю tree variant.
Спасибо за ваш пример!
29 май 21, 16:51    [22328805]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
petrav
Member

Откуда:
Сообщений: 2944
Anatoly Moskovsky
PetroNotC Sharp,

Ничего монструозного в Бусте нет.

variant - это и есть жесткая типизация.
Например если в std::visit передать перегрузки не для всех типов то просто не откомпилируется.

Э... std::variant — это всё же нарушение всех базовых принципов ООП. Эти перегрузки — это прямой
аналог оператора switch от типа объекта. Цель полиморфизма как раз и была отходом от этого switch.
29 май 21, 17:37    [22328814]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Anatoly Moskovsky
Member

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

В отличие от switch, variant не дает пропустить обработку типов.
Это принципиальная разница.
Так что это и близко не аналог switch.
По решаемой задаче это как раз аналог полиморфизма с абстрактными методами, которые подтипы должны реализовать.
29 май 21, 18:18    [22328822]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
petrav
Цель полиморфизма как раз и была отходом от этого switch.

Цель топика не полиморфизм в чистом виде.
При полиморфном объекте НЕ виртуальные методы не вызываются.
А мне нужно вызвать и меть реально разные классы.
В принципе нужно и то и то.
И метод один на всех getTextNode() и вызвать особенности индивидуального класса.
Это не классика полиморфизма с его методом Draw()
29 май 21, 18:28    [22328824]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Dimitry Sibiryakov
Member

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

При этом ты упомянул Дельфи с её классикой полиморфизма в виде всеобщего предка TObject и
его методов ClassName и т.д. и т.п.

Posted via ActualForum NNTP Server 1.5

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

Откуда:
Сообщений: 8256
Dimitry Sibiryakov
При этом ты упомянул Дельфи с её классикой полиморфизма в виде всеобщего предка TObject и
его методов ClassName и т.д. и т.п.
я упомянул tag и data pointer который есть везде (шарпе и дельфи).
А TObject как базовый класс это не совсем полиморфизм.
В Qt тоже есть базовый класс но полиморфизмом никто не зовет.
29 май 21, 18:55    [22328830]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Dimitry Sibiryakov
Member

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

PetroNotC Sharp
я упомянул tag и data pointer который есть везде (шарпе и дельфи).

И что тебе мешает в своём дереве иметь uintptr_t tag и void* data для каждой ноды?

Posted via ActualForum NNTP Server 1.5

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

Откуда:
Сообщений: 8256
Dimitry Sibiryakov,
а топик про другое. Как кастовать на сегодня с умными указателями а не по Сишному скобками как раньше.
Или работает как раньше?
29 май 21, 19:10    [22328834]     Ответить | Цитировать Сообщить модератору
 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]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
AmKad
Member

Откуда:
Сообщений: 5297
PetroNotC Sharp
Как переключать студию на раннюю версию C++
А для чего?
31 май 21, 18:06    [22329480]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Ну и про умные указатели.
Тенденция такая чтобы прогер нигде не писал new
)))
31 май 21, 18:06    [22329482]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
AmKad
PetroNotC Sharp
Как переключать студию на раннюю версию C++
А для чего?
ну вот я два дня угробил на поиск ошибки.
Справа Qt не работает. Слева студия и твой код рабочий.
Вот из за разницы в версии плюсов я и пошел не туда.
Лучше одинаково чтоб было.
Ну или переключать как в андроид студии
31 май 21, 18:09    [22329484]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
AmKad
Member

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

Посмотри где-то тут: project > Properties > C/C++ > Language > C++ Language Standard.
31 май 21, 18:14    [22329489]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
AmKad,
ОК завтра
31 май 21, 18:34    [22329496]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Последних двух строк у меня нет в 15 студии.
ОК. Проехали.
Картинка с другого сайта.
1 июн 21, 09:46    [22329667]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Короткий вопрос куда копать.
Нужна перегрузка метода класса по возврату.
Говорят в с++ не поддерживается.
Ну или такого типа
getPatamInt().toString()
Как делается такое или перегрузка?
2 июн 21, 16:04    [22330426]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
petrav
Member

Откуда:
Сообщений: 2944
И таким людям наше государство зарплату платит...
2 июн 21, 16:06    [22330429]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
petrav
И таким людям наше государство зарплату платит...
угу. У всех забрать излишки и пенсионерам раздать)
2 июн 21, 16:10    [22330433]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Алло профи!
Сам вопрос не понятен или вы любите новичков в отдельном подфоруме держать?
2 июн 21, 18:32    [22330517]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Dimitry Sibiryakov
Member

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

Ответ: в С++ такое не поддерживается. Можешь заново начинать клоунаду с его неприятием и
поиском костылей вместо правки консерватории.

Posted via ActualForum NNTP Server 1.5

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

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

Цепочку методов нельзя создать?
obj.f().f2()
Ты профи?
2 июн 21, 18:47    [22330525]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Dimitry Sibiryakov
Member

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

PetroNotC Sharp
Цепочку методов нельзя создать?

Создать можно практически всё что угодно. Назови конечную цель для которой тебе
понадобилась перегрузка по возвращаемому значению.

Для обычных целей обычно используют перегруженные операторы.

Posted via ActualForum NNTP Server 1.5

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

Откуда:
Сообщений: 8256
Dimitry Sibiryakov,
Перегрузка это МЕТОД достижения цели.
Цепочка методов - это ВТОРОЙ МЕТОД.
Цель - не писать бойлерплейт код с моим классом tree выше.
https://ru.stackoverflow.com/questions/583342/Что-такое-boilerplate-code
У класса много полей разного типа.
Его второе назначение - вывод в эксель полей в строковом виде.
Т.е. Экспортер просто должен взять поле как строку.
Не верю что ты никогда не встречал такого при работе с бд)
2 июн 21, 19:19    [22330548]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Dimitry Sibiryakov
Member

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

PetroNotC Sharp
Т.е. Экспортер просто должен взять поле как строку.

Для этого перегружают по типу параметра:
экспортер.взять(класс.поле);

Особые эстеты перегружают на стороне полей:
экспортер << класс.поле;


Ну а кривизну твоего дерева осуждают с самого начала топика.

Posted via ActualForum NNTP Server 1.5

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

Откуда:
Сообщений: 8256
Dimitry Sibiryakov,
1. Нельзя. Ты нагрузил экспортера и его надо рефакторить и потом тестировать.
Экспортеров несколько. Все будем ломать под дерево.?
2. Не понял как на стороне полей? Опять экспортер?
3. Ты не отвлекайся на кривизну Постановки задачи)))
Дак как с цепочкой?
2 июн 21, 19:38    [22330558]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

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

Не бывает такого в плюсах? Не встречал?
MyObject.Start()
    .SpecifySomeParameter(asdasd)
    .SpecifySomeOtherParameter(asdasd)
    .Execute();
2 июн 21, 19:42    [22330561]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Anatoly Moskovsky
Member

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

class Chained {
   Chained& start(int param) { save(param); return *this; }
   Chained& next(int param) { save(param); return *this; }
   Result end() { return compute(...); }
};
auto result = Chained().start(1).next(2).end();
2 июн 21, 20:10    [22330571]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Anatoly Moskovsky,
Круто. Ты волшебник.
Попробую.
2 июн 21, 20:12    [22330572]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Dimitry Sibiryakov
Member

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

PetroNotC Sharp
Экспортеров несколько. Все будем ломать под дерево.?

А кто ещё кроме них знает как именно экспортировать те или иные типы?..

PetroNotC Sharp
2. Не понял как на стороне полей? Опять экспортер?

Кто кроме самих полей знает как преобразовать себя в нужный кому-то другому тип?..

PetroNotC Sharp
Дак как с цепочкой?

Старый дерьмовый дизайн ещё с эпохи плоского Си. Класса
strcpy(strchr(strcat(strcpy(a, b), c), 0), d);

Posted via ActualForum NNTP Server 1.5

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

Откуда:
Сообщений: 8256
Dimitry Sibiryakov,
ОК. Ты предложил не мой класс дает в удобном формате а класс забиратель пусть сам преобразовывает.
Другие мысли есть или всё?
2. Я просто не понял твой метод 2. Разверни его.
3. Нет. Не получается у тебя. Смотри выше у кого в топике получается с кодом примерами на плюсах и даже 17тых
2 июн 21, 22:39    [22330631]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
Dimitry Sibiryakov
Member

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

PetroNotC Sharp
Ты предложил не мой класс дает в удобном формате а класс забиратель пусть сам преобразовывает.

Нет. Я сказал "преобразование должно происходить там, где есть знание как и во что надо
преобразовывать. Это вопрос дизайна, а не кодинга.

Posted via ActualForum NNTP Server 1.5

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

Откуда:
Сообщений: 8256
Dimitry Sibiryakov,
Ну, можно и поспорить.
У класса есть поведение. А поведение его согласно ТЗ.
Это и есть "знание как и во что надо".
Насчет того, делать классы тупыми сервисами или умными еще Фаулер спорил.
И кстати, к золотой пули не пришли.
https://habr.com/ru/post/346016/
Анемичная модель

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

Откуда:
Сообщений: 8256
Начиная с Qt 5.4 вы также можете писать:
qDebug().nospace().noquote() << var1;
)
3 июн 21, 11:37    [22330811]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Нужно при работе с умными указателями обнулять переменную руками?
Напр
tree<shared ptr.... ptr;
for(...
ptr = map[key] ;
4 июн 21, 10:39    [22331223]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Дурдом сделали с этими умными...
У меня удаляются ноды в дереве при выходе переменной из области.
4 июн 21, 10:52    [22331228]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Anatoly Moskovsky
PetroNotC Sharp
Я же выше написал код с ошибкой. Как убрать ошибку?


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

// cannot convert from unique ptr


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

Подскажи как правильно брать дерево или кусок дерева на редактирование при shared и при unique ptr?
Если нужно владельца нод только само дерево. И это логично. То почему получая дерево, и правя ветки, уничтожаются только ветки? Так дерево некорректно написано?
В шаблоне разве не один тип на все веточки ноды?
4 июн 21, 11:02    [22331234]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
QMap<QString, tree<shared.... >>> map
...
tree.add(....
map[]=tree // ветки остаются и все работает
...
tree = map[].values()
tree.add(...// ветки уничтожаются

Это получается либо неправильно беру из мапы, либо в мапу тоже добавлять дерево через умный?
Первое или второе?
4 июн 21, 11:12    [22331239]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
AmKad
Member

Откуда:
Сообщений: 5297
Ну и Петруха, развел балаган на 5 страниц.
4 июн 21, 11:33    [22331247]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
AmKad,
Ну дак подсказывай. Не балагань)
4 июн 21, 11:35    [22331250]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
AmKad,
Почему счетчик расшаренного указателя не работает и уничтожает объект?
4 июн 21, 11:36    [22331253]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
AmKad,
Хмммм
Решил)))
Надо было адрес брать и присваивать после того как отдали объект в мапу))).
Вам бы отдельный топик для новичков. Изверги))
4 июн 21, 11:49    [22331259]     Ответить | Цитировать Сообщить модератору
 Re: Tree + полиморфный. Как кастовать в наследника?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
Дерево отличное. Всем рекомендую. 6 видов итераторов.
4 июн 21, 11:58    [22331266]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4 5      [все]
Все форумы / C++ Ответить