На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Умный указатель на parent-объект
    Много говорится о том что умные указатели следует применять вообще везде, где бы вы применили обычный указатель.
    Вопрос : объект в конструкторе создаёт несколько дочерних объектов с помощью make_shared, тут понятно. Но в дочернем объекте хорошо бы хранить указатель на parent-объект.
    С обычным указателем понятно - в конструктор дочернего объекта передаём this и там его сохраняем. А вот как сохранить связь дочернего с родителем без использования обычных указателей?
      std::weak_ptr, если всё дерево через std::make_shared создаётся.
        Задумывалось что дочерние объекты создаются в конструкторе родительского объекта. Не совсем понятно как в этот момент получить weak_ptr на себя.
        Можно ли сделать так : наследовать родительский объект от enable_shared_from_this и создавать экземпляров родительского объекта через статическую функцию типа
        ExpandedWrap disabled
          class ChildObj
          {
              ChildObj(weak_ptr<ParentObj> parent)
              {
              .....
              }
          }
           
          class ParentObj : public enable_shared_from_this<ParentObj>
          {
              shared_ptr<ParentObj> create()
              {
                  auto pointer = shared_from_this();
                  child.push_back(make_shared<ChildObj> (pointer));
                  return pointer;
              }
          }
          В конструкторе вызвать shared_from_this в любом случае не получится, т.к. конструктор вызывается до создания shared_ptr<ParentObj>.

          В данной задаче вообще непонятно, зачем использовать shared_ptr. Это нужно, если ты хочешь хранить где-то ссылки на ChildObj вне зависимости от ParentObj - тогда нужно использовать shared_ptr<ChildObj> и weak_ptr<ParentObj>, но отказаться от создания ChildObj в конструкторе, либо инициализировать указатель на Parent позже.

          В ином случае лучше использовать unique_ptr<ChildObj> в родителе и ссылку на ParentObj в ChildObj.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0210 ]   [ 17 queries used ]   [ Generated: 19.04.24, 20:34 GMT ]