Название: Вумные указатели Отправлено: Авварон от Ноябрь 18, 2016, 00:09 Поиграю-ка я в Igors'а.
Допустим, у нас есть класс, который овнит объекты. Например, содержит дерево внутри себя. Чтоб далеко не ходить - QTextDocument::rootFrame (http://doc.qt.io/qt-5/qtextdocument.html#rootFrame). Внутри, понятное дело, мы заюзаем std::unique_ptr. А снаружи? Отдавать голый указатель? Попахивает 90ми годами. Или всё-таки внутри делаем std::shared_ptr и отдаём копию? Но смысл иметь фрейм без документа? Тогда weak? Но ведь лочить неудобно, да и всё равно овнершип "размазывается". Как это делается в "modern c++"? Название: Re: Вумные указатели Отправлено: _Bers от Ноябрь 18, 2016, 04:36 как то так:
Код: xml::document doc("blablabla.xml"); суть в том, что node - легковесный интерфейсный класс, который держит под капотом либо std::weak_ptr, либо std::shared_ptr (в зависимости от потребностей задачи). однако пользователи работают с объектами, как с обычными автоматическими переменными на стеке. и не заморачиваются деталями реализации. Название: Re: Вумные указатели Отправлено: Авварон от Ноябрь 18, 2016, 10:57 Может ли нод жить без документа? В случае QJsonValue, очевидно, может.
В случае QTextFrame вроде нет. Далее, QTextFrame может изменяться. Красиво ли, что изменяется наша копия? Или она должна детачить? Название: Re: Вумные указатели Отправлено: __Heaven__ от Ноябрь 18, 2016, 11:16 А что такого в изменении данных? :)
ИМХО, нужно просто знать пользователю, как с этим работать. Конечно, это требует немного большей компетенции :) Например, ситуация Код Или ситуация, когда мы в одном месте коннектим спинбокс к слайдеру, например, а в другом пользуемся указателем на виджет слайдера. Ясное дело, что может изменяться объект, адрес которого содержит указатель... Название: Re: Вумные указатели Отправлено: Авварон от Ноябрь 18, 2016, 12:11 А что такого в изменении данных? :) ИМХО, нужно просто знать пользователю, как с этим работать. Конечно, это требует немного большей компетенции :) Например, ситуация Код Или ситуация, когда мы в одном месте коннектим спинбокс к слайдеру, например, а в другом пользуемся указателем на виджет слайдера. Ясное дело, что может изменяться объект, адрес которого содержит указатель... Так ведь указатель же. В примере с нодами мы об указателях вообще ничего не знаем, мы держим копию. То, что при изменении одной копии меняется другая - странно. Вот, собственно структура. Код: class Document; Мне кажется, или в std не хватает "глупого" указателя, который суть итератор без возможности итерации? Название: Re: Вумные указатели Отправлено: __Heaven__ от Ноябрь 18, 2016, 12:43 Если я вас правильно понял, то, кажется, здесь будет уместен механизм-обёртка подсчёта ссылающихся на одни и те же данные нодов.
При попытке изменения данных производится глубокое копирование данных и их изменение. Подобный механизм в контейнерах Qt реализован. Название: Re: Вумные указатели Отправлено: Авварон от Ноябрь 18, 2016, 12:49 Если я вас правильно понял, то, кажется, здесь будет уместен механизм-обёртка подсчёта ссылающихся на одни и те же данные нодов. При попытке изменения данных производится глубокое копирование данных и их изменение. Подобный механизм в контейнерах Qt реализован. Но мне не нужен подсчёт нодов. У меня есть четкий овнер нодов - это Document. Внутри дерева нодов тоже есть иерархия - парент владеет детьми. Вопрос, как это сделать в modern c++, без голых указателей. Название: Re: Вумные указатели Отправлено: __Heaven__ от Ноябрь 18, 2016, 14:12 А, я понял.
Для меня возврат глупого указателя не пахнет 90ми :) С weak_ptr не работал - интересно будет послушать мнение других. Название: Re: Вумные указатели Отправлено: _Bers от Ноябрь 18, 2016, 15:51 Может ли нод жить без документа? В случае QJsonValue, очевидно, может. В случае QTextFrame вроде нет. Далее, QTextFrame может изменяться. Красиво ли, что изменяется наша копия? Или она должна детачить? если нода не может жить без документа - держит под капотом std::weak_ptr Название: Re: Вумные указатели Отправлено: Авварон от Ноябрь 18, 2016, 16:06 Если заюзать shared_ptr, то придётся использовать богомерзкий enable_shared_from_this для Document, который на корню убивает возможность не пользовать shared_ptr. Название: Re: Вумные указатели Отправлено: Old от Ноябрь 18, 2016, 18:15 Набросок, но рабочий. :)
main.cpp Код
tree.h Код
tree.cpp Код
Название: Re: Вумные указатели Отправлено: Igors от Ноябрь 19, 2016, 08:53 Цитировать Shared pointer Да, объект будет шариться, но про его члены никто ничего не обещал, на то оно и limited. Это в пытоне или жабе объект живет пока используется хоть один его член - что впрочем не бесплатно и приносит не только выгоды. А здесь такого нет, поэтому искать пятый угол не стоит.Manages the storage of a pointer, providing a limited garbage-collection facility, possibly sharing that management with other objects. Название: Re: Вумные указатели Отправлено: Авварон от Ноябрь 30, 2016, 15:42 Old
Ну да, что-то такое на чистых плюсах и должно быть, спасибо. К сожалению, для Qt с их любовью к голым указателям, не очень подходит. Igors К чему это? Название: Re: Вумные указатели Отправлено: Old от Ноябрь 30, 2016, 16:18 К сожалению, для Qt с их любовью к голым указателям, не очень подходит. Это не любовь, это legacy. :) |