powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Tree + полиморфный. Как кастовать в наследника?
108 сообщений из 108, показаны все 5 страниц
Tree + полиморфный. Как кастовать в наследника?
    #40073640
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть либа из одного заголовка tree.h
https://github.com/kpeeters/tree.hh
Все работает и мне удалось загнать в node полиморфный объект и прочитать.
Не удалось кастовать базовый класс к наследнику.
Это код при записи в node string
Код: plaintext
1.
2.
3.
4.
5.
tree<string>::sibling_iterator sib=tr.begin(loc);
   while(sib!=tr.end(loc)) {
     cout << (*sib) << endl;
     ++sib;
     }


При записи вместо string базового класса и наследника, я получаю базовый так:
MyBase base = *sib;
Как кастовать в наследника его?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073641
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попутный вопрос.
Как работает поиск node в итераторе если ищется не строка а поле класса?
Сейчас при смене типа у меня find не компилится
loc=find(tr.begin(), tr.end(), "two");
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073646
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доп.вопрос.
Почему
cout << typeid(base).name() << endl;
Не выводит имя MyBase, а выводит.. (по памяти)
74namespaceMyBase12345
)) компа нет под рукой))
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073669
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

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

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

Я бы за. Но не вижу специфических методов наследника в IDE.
Они только у наследника.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073683
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

Ну ты то умнее IDE... Или нет?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073694
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
#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;
}


Код: plaintext
1.
2.
3.
Second
Third
First


PetroNotC Sharp
Попутный вопрос.
Как работает поиск node в итераторе если ищется не строка а поле класса?
Сейчас при смене типа у меня find не компилится
loc=find(tr.begin(), tr.end(), "two");
std::find_if
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073705
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
Спасибо. Круто.
Выше писал что мне нужен НЕ виртуальный метод в наследнике.
Вызов виртуального у меня работает. Там приведение типов не нужно.
Возможно все дело в том что я вместо
mTree.insert(... std::make_unique<ChildFirst>());
по аналогии со строкой
mTree.insert(... "abc" );
Делал
mTree.insert(... ChildFirst(123, "abc") );
Умных указателей развелось.
Доберусь до компа попробую.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073707
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl
PetroNotC Sharp,

Ну ты то умнее IDE... Или нет?
не)))))
Я к IDE отношусь с богопочтением.))
Мне нужно после точки подсказка по кастованному объекту.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073713
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторИспользуя информацию о типах во время выполнения, можно проверить, указывает ли указатель на полный объект и можно ли безопасно выполнить приведение этого указателя, чтобы он указывал на другой объект в своей иерархии. Для выполнения этих типов приведений можно использовать оператор dynamic_cast
Вот у меня это не выходило, возможно из за статической инициализации без оператора new объекта.
std::make_unique не приходилось использовать ни разу. Каюсь.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073736
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
Блин))) у меня с++11
Пробовать оператор new?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073740
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
Можно пример для с11?
Ни shared_ptr, ни unique_ptr, ни new не работают.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073743
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Доп.вопрос.
Почему
cout << typeid(base).name() << endl;
Не выводит имя MyBase, а выводит.. (по памяти)
74namespaceMyBase12345
)) компа нет под рукой))
пишет так
N5my15my213ClassMyE
Для
namespace my1{
namespace my2{
class ClassMy
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073752
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp

Возможно все дело в том что я вместо
mTree.insert(... std::make_unique<ChildFirst>());
по аналогии со строкой
mTree.insert(... "abc" );
Делал
mTree.insert(... ChildFirst(123, "abc") );
Умных указателей развелось.
Указатель на тип базового класса нужен для вызова виртуальных (полиморфных) методов объектов дочерних классов. Умный он или не очень - в данном контексте не так важно. make_unique появился в C++14, но и до него в C+11 была возможность инициализации умного указателя, правда, в чуть более длинной форме.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073757
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
Пробовал. Не выходит. ((
А с pointer = new class не берет сама либа
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073758
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Пробовал. Не выходит. ((
Ошибка в 17-ой строке.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073759
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
Главное, со статической инициализацией все работает. И я так понял потом кастовать в наш указатель уже поздно что ли?
Я вообще на либу подумал.
Но потом все заработало кроме получения полного класса из базового.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073760
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
PetroNotC Sharp
Пробовал. Не выходит. ((
Ошибка в 17-ой строке.
ОК чуть позже все перепроверю.
Спс.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073838
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
Загрузил твой код не в Qt с 11 а в студии
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
Как исправить?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073859
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

Fix лежит на поверхности, но я не дам тебе решения, пока ты не объяснишь какую задачу ты решаешь и для каких целей тебе такая конвертация.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073865
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
Ну, во первых это обычное поле data pointer в деревьях еще со времен дельфи.
Во вторых, мне конкретно в листьях дерева нужен класс ЛистДерева с бизнес данными.
А выше структура это просто классификатор.
Например, в листьях Семья с атрибутами. А дерево это адрес.
Или
....
Это банальная Модель данных повсюду.
Как поле tag в любом vcl объекте.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073866
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
Раньше была Сишная конвертация)))
А теперь наворотили из за отсутствия сборщика мусора?
(про shared ptr почитал)))
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073868
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
foreach (var node in tree.nodes) {
    node.Tag as ClassY).functionX()
} 


Это шарп
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073869
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
И вообще, чем дерево как коллекция отличается от списка TList?
Я же не о полиморфизме счас.
Там нельзя наследников держать?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073900
Фотография 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.
#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;
}
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073913
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
Я же привел пример выше с классом Семья в листьях дерева.
Как будем решать?
В не листьях требуется только строка адреса Область-Район-Город-..
Тогда базовый класс будет и адресом и семьей? Так что ли?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073918
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
Странно что это нельзя сделать в плюсах)
22328546
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073921
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
Это как реализуете?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073943
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
#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 (если я правильно выразился)?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073958
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Анатолий, а зачем вы здесь применили ссылку на rvalue (если я правильно выразился)?

Это идиоматический код, подходящий для любых ситуаций.
В данном случае это универсальная(universal/forwarding) ссылка (т.к. auto создает контекс вывода типа, как в шаблонах).
В зависимости от результата * итератора она станет либо rvalue либо lvalue ссылкой.
В случае если *it это не ссылка, а значение - это полезное свойство, так как auto& не примет такое значение, а просто auto может быть дорого.
Так что в generic коде - самое оно.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073960
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Странно что это нельзя сделать в плюсах)
22328546

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

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

Я уже написал как делать - создать классы на каждый тип узла дерева и перечислить их в variant.
А потом при обходе дерева использовать std::visit для выполнения кода специфичного для каждого типа.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073968
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Если есть наследование, то выше вам уже написали - dynamic_cast решает эту же задачу.

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

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

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

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

То есть либа выше не предусматривает приведения типа?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073972
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Anatoly Moskovsky,
Я же привел пример выше с классом Семья в листьях дерева.
Как будем решать?
В не листьях требуется только строка адреса Область-Район-Город-..
Тогда базовый класс будет и адресом и семьей? Так что ли?
А зачем тогда в ветках (на уровне Область-Район-Город) методы для листьев (Семьи)?

Но вообще, не понимаю в чем у тебя проблема то?
Ну сделай себе вместо дерева матрешку.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class Family;
class City {
   vector<Family> families;
};
class Area {
   vector<City> cities;
};
class Region {
  vector<Area> areas;
};

А потом добавляй в эти классы объединяющие методы например:
Код: plaintext
1.
2.
3.
City::dinnerTime() { 
  for_each (families.begin(), families.end(), [](Family f){f.eat();});
}

По существу это тоже самое дерево, но на каждой высоте у тебя будет именованный класс.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073973
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Я же выше написал код с ошибкой. Как убрать ошибку?


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

// cannot convert from unique ptr


Если речь про эту ошибку то - так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ChildFirst* child = dynamic_cast<ChildFirst*>(v.get());
if (child) {
   //  ChildFirst
}
else {
  // other class
}
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073974
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
PetroNotC Sharp
Я же выше написал код с ошибкой. Как убрать ошибку?


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

// cannot convert from unique ptr



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

спасибо. Ты волшебник)
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073975
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,
- методы Семьи только в наследнике. А он в листьях дерева.
В остальных ОДИН виртуальный метод
getNodeName() - там типа адрес или район или область.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073976
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
По существу это тоже самое дерево, но на каждой высоте у тебя будет именованный класс.

нельзя. Это классификатор. Там все может менятся. Там не нужна строгая типизация и строгие классы.
Например, может быть "два раза город" и т.д.
То есть это чел сам строит дерево и добавляет строки прямо в узел дерева.
Главный класс это листья дерева.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073977
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,
То что каждая мапа это в принципе дерево я согласен)).
Но бывает удобно настоящее дерево.
С плюшками (итератор обхода всего дерева\обхода одного уровня, методы добавления и рекурсии, перемещения нод и т.д.)
http://stlplus.sourceforge.net/stlplus3/docs/ntree.html
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40073985
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

std::variant это c++17, а топик хочет 11 и доку не читать =)
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074005
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl,

В Бусте есть и для 11 ))
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074013
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Желательно С++11.
Имхо буст ставить как то монструозно.
Ну а к самому типу вариант я как то отношусь с осторожностью.
Очень люблю жесткую типизацию. Чтобы все под контролем)
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074044
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

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

variant - это и есть жесткая типизация.
Например если в std::visit передать перегрузки не для всех типов то просто не откомпилируется.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074048
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
>variant - это и есть жесткая типизация.
= Variant — это специальный тип данных, который может содержать любой вид данных
Тут имхо вопрос двоякий
tree<типизацияПолиморфная>
Или
tree<типизацияТипаВариант>
Что лучше надо смотреть. Опыта такого у меня нет.
...
Я выше сказал что мне лично неудобно по многим критериям а не именно variant.
У меня Qt C++11
Для установки буст нужно разрешения заказчика.
Я этот буст вообще не юзал. Мне бы в умных указателях разобраться.
А вот дерево выше из одного файла заголовка вообще идеально.
Будет у меня 17я с удовольствием посмотрю tree variant.
Спасибо за ваш пример!
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074053
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
PetroNotC Sharp,

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

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

Э... std::variant — это всё же нарушение всех базовых принципов ООП. Эти перегрузки — это прямой
аналог оператора switch от типа объекта. Цель полиморфизма как раз и была отходом от этого switch.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074060
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Эти перегрузки — это прямой
аналог оператора switch от типа объекта.

В отличие от switch, variant не дает пропустить обработку типов.
Это принципиальная разница.
Так что это и близко не аналог switch.
По решаемой задаче это как раз аналог полиморфизма с абстрактными методами, которые подтипы должны реализовать.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074062
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Цель полиморфизма как раз и была отходом от этого switch.

Цель топика не полиморфизм в чистом виде.
При полиморфном объекте НЕ виртуальные методы не вызываются.
А мне нужно вызвать и меть реально разные классы.
В принципе нужно и то и то.
И метод один на всех getTextNode() и вызвать особенности индивидуального класса.
Это не классика полиморфизма с его методом Draw()
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074064
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При этом ты упомянул Дельфи с её классикой полиморфизма в виде всеобщего предка TObject и
его методов ClassName и т.д. и т.п.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074066
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
При этом ты упомянул Дельфи с её классикой полиморфизма в виде всеобщего предка TObject и
его методов ClassName и т.д. и т.п.
я упомянул tag и data pointer который есть везде (шарпе и дельфи).
А TObject как базовый класс это не совсем полиморфизм.
В Qt тоже есть базовый класс но полиморфизмом никто не зовет.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074067
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharpя упомянул tag и data pointer который есть везде (шарпе и дельфи).

И что тебе мешает в своём дереве иметь uintptr_t tag и void* data для каждой ноды?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074070
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
а топик про другое. Как кастовать на сегодня с умными указателями а не по Сишному скобками как раньше.
Или работает как раньше?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074072
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
void* data

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

// cannot convert from unique ptr




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


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

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


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


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

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


Далее. Я собирался определять что это лист дерева, либо по имени класса либо добавит вирт функцию дайМнеТипУзла.
Но в появившемся динамическом кастинге уже все есть.
if (если null то нет наследника).
Работает.
ЗЫ.
Как переключать студию на раннюю версию C++ вопрос актуальный.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074482
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Как переключать студию на раннюю версию C++
А для чего?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074484
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и про умные указатели.
Тенденция такая чтобы прогер нигде не писал new
)))
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074486
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
PetroNotC Sharp
Как переключать студию на раннюю версию C++
А для чего?
ну вот я два дня угробил на поиск ошибки.
Справа Qt не работает. Слева студия и твой код рабочий.
Вот из за разницы в версии плюсов я и пошел не туда.
Лучше одинаково чтоб было.
Ну или переключать как в андроид студии
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074490
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

Посмотри где-то тут: project > Properties > C/C++ > Language > C++ Language Standard.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074492
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
ОК завтра
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40074601
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последних двух строк у меня нет в 15 студии.
ОК. Проехали.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075116
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короткий вопрос куда копать.
Нужна перегрузка метода класса по возврату.
Говорят в с++ не поддерживается.
Ну или такого типа
getPatamInt().toString()
Как делается такое или перегрузка?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075119
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И таким людям наше государство зарплату платит...
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075122
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
И таким людям наше государство зарплату платит...
угу. У всех забрать излишки и пенсионерам раздать)
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075193
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алло профи!
Сам вопрос не понятен или вы любите новичков в отдельном подфоруме держать?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075196
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответ: в С++ такое не поддерживается. Можешь заново начинать клоунаду с его неприятием и
поиском костылей вместо правки консерватории.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075200
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Цепочку методов нельзя создать?
obj.f().f2()
Ты профи?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075203
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC SharpЦепочку методов нельзя создать?

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

Для обычных целей обычно используют перегруженные операторы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075214
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Перегрузка это МЕТОД достижения цели.
Цепочка методов - это ВТОРОЙ МЕТОД.
Цель - не писать бойлерплейт код с моим классом tree выше.
https://ru.stackoverflow.com/questions/583342/Что-такое-boilerplate-code
У класса много полей разного типа.
Его второе назначение - вывод в эксель полей в строковом виде.
Т.е. Экспортер просто должен взять поле как строку.
Не верю что ты никогда не встречал такого при работе с бд)
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075218
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC SharpТ.е. Экспортер просто должен взять поле как строку.

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


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



Ну а кривизну твоего дерева осуждают с самого начала топика.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075223
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
1. Нельзя. Ты нагрузил экспортера и его надо рефакторить и потом тестировать.
Экспортеров несколько. Все будем ломать под дерево.?
2. Не понял как на стороне полей? Опять экспортер?
3. Ты не отвлекайся на кривизну Постановки задачи)))
Дак как с цепочкой?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075224
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Не бывает такого в плюсах? Не встречал?
Код: plaintext
1.
2.
3.
4.
MyObject.Start()
    .SpecifySomeParameter(asdasd)
    .SpecifySomeOtherParameter(asdasd)
    .Execute();
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075232
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

Код: plaintext
1.
2.
3.
4.
5.
6.
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();
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075233
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
Круто. Ты волшебник.
Попробую.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075261
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC SharpЭкспортеров несколько. Все будем ломать под дерево.?

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

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

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

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

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


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075268
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
ОК. Ты предложил не мой класс дает в удобном формате а класс забиратель пусть сам преобразовывает.
Другие мысли есть или всё?
2. Я просто не понял твой метод 2. Разверни его.
3. Нет. Не получается у тебя. Смотри выше у кого в топике получается с кодом примерами на плюсах и даже 17тых
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075283
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC SharpТы предложил не мой класс дает в удобном формате а класс забиратель пусть сам преобразовывает.

Нет. Я сказал "преобразование должно происходить там, где есть знание как и во что надо
преобразовывать. Это вопрос дизайна, а не кодинга.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075318
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Ну, можно и поспорить.
У класса есть поведение. А поведение его согласно ТЗ.
Это и есть "знание как и во что надо".
Насчет того, делать классы тупыми сервисами или умными еще Фаулер спорил.
И кстати, к золотой пули не пришли.
https://habr.com/ru/post/346016/
Анемичная модель
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075370
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начиная с Qt 5.4 вы также можете писать:
qDebug().nospace().noquote() << var1;
)
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075589
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно при работе с умными указателями обнулять переменную руками?
Напр
tree<shared ptr.... ptr;
for(...
ptr = map[key] ;
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075593
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дурдом сделали с этими умными...
У меня удаляются ноды в дереве при выходе переменной из области.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075597
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
PetroNotC Sharp
Я же выше написал код с ошибкой. Как убрать ошибку?


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

// cannot convert from unique ptr



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


Подскажи как правильно брать дерево или кусок дерева на редактирование при shared и при unique ptr?
Если нужно владельца нод только само дерево. И это логично. То почему получая дерево, и правя ветки, уничтожаются только ветки? Так дерево некорректно написано?
В шаблоне разве не один тип на все веточки ноды?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075600
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
QMap<QString, tree<shared.... >>> map
...
tree.add(....
map[]=tree // ветки остаются и все работает
...
tree = map[].values()
tree.add(...// ветки уничтожаются


Это получается либо неправильно беру из мапы, либо в мапу тоже добавлять дерево через умный?
Первое или второе?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075604
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и Петруха, развел балаган на 5 страниц.
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075606
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
Ну дак подсказывай. Не балагань)
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075607
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
Почему счетчик расшаренного указателя не работает и уничтожает объект?
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075611
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,
Хмммм
Решил)))
Надо было адрес брать и присваивать после того как отдали объект в мапу))).
Вам бы отдельный топик для новичков. Изверги))
...
Рейтинг: 0 / 0
Tree + полиморфный. Как кастовать в наследника?
    #40075616
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дерево отличное. Всем рекомендую. 6 видов итераторов.
...
Рейтинг: 0 / 0
108 сообщений из 108, показаны все 5 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Tree + полиморфный. Как кастовать в наследника?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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