Как сохранить слабый указатель на родителя в C ++? - PullRequest
2 голосов
/ 29 июня 2009

Существует ли стандартный способ поддерживать слабый указатель на родителя (который создается с помощью общего указателя) в дочернем объекте в C ++?

По сути, мне нужно реализовать что-то вроде следующего:

Class B;

Class A
{

...
private:
B m_b;
};

Class B
{
....
public:
void SetParentPtr(const boost::shared_ptr<A>& a)
{
m_parentPtr = a;
}
private:
boost::weak_ptr<A> m_parentPtr;
};

В приведенном выше примере все экземпляры класса B должны содержать слабый указатель на своего родителя (т.е. объект класса A). Объекты класса A создаются с использованием shared_ptr. Я могу придумать решение, которое использует нулевой удалитель. Но это стандартный способ сделать что-то подобное?

Ответы [ 3 ]

5 голосов
/ 29 июня 2009

То, что вы делаете выше, явно поддерживается weak_ptr и shared_ptr, что происходит, когда вы пытаетесь это сделать? Чтобы быть более точным, делайте то, что вы делаете, без нулевого удалителя, и затем вы используете стандартное поведение на weak_ptr, чтобы преобразовать его в shared_ptr, если необходимо:

boost::shared_ptr<X> it=myWeakPtr.lock();
if (it)
{
  // if the conversion succeeded, then the parent instance is still alive
}
2 голосов
/ 29 июня 2009

Существует неявное преобразование в weak_ptr, поэтому вы можете использовать

void SetParentPtr(boost::weak_ptr<A> a) { }

непосредственно.

проверьте также boost :: shared_from_this, чтобы родитель мог дать указатель на себя, не сохраняя слабый_птр явно.

В противном случае это выглядит как обычный способ иметь обратный указатель. Просто проверьте, есть ли реальная добавленная стоимость в использовании обратных указателей.

1 голос
/ 29 июня 2009

Я бы попробовал сделать что-то вроде этого:

class A
{
A(){};

public:

static boost::shared_ptr<A> Create()
{
    boost::shared_ptr<A> newPtr(new A());
    newPtr->m_self = newPtr;
    return newPtr;
}

// ...

void CreateChild()
{
    m_childPtr = B::Create(m_self);
}

private:
boost::shared_ptr<B> m_childPtr;
boost::weak_ptr<A> m_self;
};

class B
{   
B(){};

public:

static boost::shared_ptr<B> Create(boost::shared_ptr<A> ptrA)
{
    boost::shared_ptr<B> newPtr(new B());
    newPtr->m_parentPtr = ptrA;
    return newPtr;
}

boost::weak_ptr<A> m_parentPtr;
};
...