LINUX.ORG.RU

shared_ptr и union

 


0

1
enum Type { Reference, Data };

class Node {
private:
    std::shared_ptr<Node> m_next{};
    enum Type m_type;
    union Information {
        std::string data;
        std::shared_ptr<Node> son;
    } m_info;

public:
    Node(std::string data);
    Node();

    void                    setNext(std::shared_ptr<Node> next);

    std::shared_ptr<Node>   getNext();
    enum Type               getType();
    std::shared_ptr<Node>   getSon();
    std::string             getData();
};

Имеется код подобного содержания. Класс, в зависимости от m_type должен содержать либо строку в m_info, либо ссылку на такую же ноду.

Компилятор ругается на отсутствие конструктора/деструктора для union'а. Как правильно делается?

Deleted

Последнее исправление: merhalak (всего исправлений: 1)

Компилятор ругается на отсутствие конструктора/деструктора для union'а. Как правильно делается?

Может попробовать их написать? Самому не приходилось, но вроде можно.

xaizek ★★★★★
()

в union нельзя std::string

std::shared_ptr, кстати тоже нельзя.

смотри как boost::variant устроен например или boost::any. Все проще делается.

anonymous
()
Ответ на: комментарий от anonymous

хотя std::shared_ptr можно, если описать конструктор. Но это жепь на самом деле. лучше так не делай.

anonymous
()

Хочешь экономить память - используй интрузивные указатели вместо shared_ptr.

anonymous
()
Ответ на: комментарий от eao197

Обана! Оказывается и стринги можно! Как погляжу, потом деструкторы вручную дергать :-/

Извращенцы, чо.

anonymous
()
Ответ на: комментарий от anonymous

Это только в С++11 и выше можно, впрочем я не вижу проблемы сделать это и более старых версиях, просто без union.

anonymous
()
Ответ на: комментарий от asaw

Нет, но рекомендуют. Требуют разве что интерфейсы (кнопочки им подавай). А вот умные указатели, как и вообще ООП, нам никто не объяснял. Но из-за того, что у меня год до этого возни с ООП на Java был, не могу заставить себя писать на плюсах и winforms каких-нибудь в императивном стиле.

Deleted
()
Ответ на: комментарий от anonymous

c++11 использовать можно, если умеешь, конечно.

Deleted
()
Последнее исправление: merhalak (всего исправлений: 1)

Зачем тут вообще shared_ptr и union?

anonymous
()
Ответ на: комментарий от Deleted

Использовать union вообще не очень хорошо, а уж использовать в них не примитивные типы - вообще зло.

anonymous
()
Ответ на: комментарий от Deleted

Нет, но рекомендуют.

Ну и дураки. union нужен крайне редко, и уж точно не в твоём случае. Он размещает члены в одной области памяти. А у тебя там помещены сложные типы, которые сами выделяют память в куче. Поэтому ничего кроме проблем ты от этого union'а не получишь. С другой стороны инкапсуляцию ты и так уже используешь, поэтому ничего тебе не мешает выкинуть union и использовать его члены в зависимости от значения m_type. А вообще, эта реализация списка, что у тебя, с точки зрения C++ плохая. Это в ФП любят так определять списки, а в С++ для этого используют контейнеры.

asaw ★★★★★
()
Ответ на: комментарий от Deleted

Не понятно, приведенный в стартовом сообщении код — это условие задачи или же одна из ваших итераций. Если это не условие задачи, то совместить в узле дерева либо строковое значение, либо указатель на дочерний узел можно и без union-а.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Это нода - один из узлов иерархического списка.

Deleted
()
Ответ на: комментарий от asaw

Написать иерархический список и поиск обычного списка в нём. С гуями. Узел иерархического списка содержит ссылку на следующего, и, либо данные, либо ссылку на иерархический список (поддерево). В лекциях для этого или-или используется юнион. И то что я называл ссылками - указатели.

Deleted
()
Последнее исправление: merhalak (всего исправлений: 2)
Ответ на: комментарий от Deleted

А это обязательно на С++ писать? Просто в языках с поддержкой алгебраических типов данных такое сделать куда проще. Ну и у вас в лекциях union используется наверно потому, что там С, а в С tagged union - вполне нормальный подход.

anonymous
()
Ответ на: комментарий от Deleted

Ну понятно, то есть задача, видимо, подразумевает показать детали реализации этого дерева (в противном случае нужно было бы использовать контейнеры). Но union тут всё равно не нужен.

В лекциях для этого или-или используется юнион.

В лекциях, наверное, использовались голые указатели и простые типы - с ними всё проще в плане помещения их в union. Но и в этом случае использование union - экономия на спичках по большому счету (учитывая, что это всего лишь учебный пример).

asaw ★★★★★
()
Последнее исправление: asaw (всего исправлений: 1)
Ответ на: комментарий от anonymous

В лекциях используется Си, так как преподаватели «видеть уже не могут Си». И переносят свой курс на плюсы. Но что-либо кроме плюсов они видеть не хотят: слишком просто это для нас видете ли.

Deleted
()
Ответ на: комментарий от asaw

Да, я в курсе. Да, там голые указатели, но меня они уже подза...долбали в общем. Я бы с радостью под каждую лабу новый язык использовал.

С чистыми указателями готов возиться лишь тогда, когда у меня в руках си и нет чертовых интерфейсов, которые непонятно как освобождать.

Deleted
()
Последнее исправление: merhalak (всего исправлений: 1)
Ответ на: комментарий от anonymous

в union нельзя std::string

можно, в C++11 добавили «unrestricted unions»

dilmah ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.