У меня есть два класса с отношениями отцов и детей (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;
Но теперь Родитель никогда не умирает, потому что он содержит ссылку на себя
Я уверен, что 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();
}
};
Поскольку в другом ответе указан указатель, сначала вам нужно использовать enable_shared_from_this
, чтобы получить shared_ptr
, а затем дочерний элемент ] не может содержать эту ссылку, он должен использовать weak_ptr
. weak_ptr
аналогичен shared_ptr
, за исключением того, что он не будет содержать ссылку, пока вы не вызовете метод get ()
, который вернет вам обычный shared_ptr
, от которого вы должны избавиться, как только сможете, внутри ребенка.