повысьте shared_ptr и 'это'

У меня есть два класса с отношениями отцов и детей (customer&order directory&file и т.д.)

Я имею

typedef boost::shared_ptr<Parent> ParentPtr

и в родительском классе метод для создания ребенка

Мне нужны дочерние экземпляры, чтобы иметь указатели на их родителя.

class Child
{
 ....
     ParentPtr m_parent;
 ....
}

Я хочу, чтобы это было shared_ptr так, чтобы родитель не исчезал, в то время как существуют существующие дети. У меня также есть другие люди содержание ParentPtrs к родителю (метод фабрики для Родителей возвращает ParentPtr),

Вопрос: как может дать ребенку ParentPtr

попытка (1). В Родителе:: ChildFactory

child->m_parent.reset(this);

это приводит к очень плохим вещам. Существует теперь 2 ParentPtr 'цепочки', указывающие на родителя; результатом является преждевременная смерть Родителя

попытка (2). Родитель имеет

ParentPtr m_me;

который копируется с возвращаемого значения Родительской фабрики. Таким образом, я могу сделать

child->m_parent = m_me;

Но теперь Родитель никогда не умирает, потому что он содержит ссылку на себя

5
задан manlio 22 March 2014 в 15:16
поделиться

2 ответа

Я уверен, что enable_shared_from_this решит вашу проблему: http://live.boost.org/doc/libs/1_43_0/libs/smart_ptr/enable_shared_from_this. html

Если вы создали свой класс на основе специализации boost::enable_shared_from_this, то вы можете использовать shared_from_this() в функции-члене для получения общего указателя, которому принадлежит this (при условии, что он есть).

Например,

class Parent : public boost::enable_shared_from_this<Parent>
{
    void MakeParentOf(Child& c)
    {
        c.m_parent = shared_from_this();
    }
};
8
ответ дан 14 December 2019 в 04:29
поделиться

Поскольку в другом ответе указан указатель, сначала вам нужно использовать enable_shared_from_this , чтобы получить shared_ptr , а затем дочерний элемент ] не может содержать эту ссылку, он должен использовать weak_ptr . weak_ptr аналогичен shared_ptr , за исключением того, что он не будет содержать ссылку, пока вы не вызовете метод get () , который вернет вам обычный shared_ptr , от которого вы должны избавиться, как только сможете, внутри ребенка.

0
ответ дан 14 December 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: