2

是否有一种标准方法可以在 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 实例化。我可以想到一个使用空删除器的解决方案。但这是做这种事情的标准方式吗?

4

3 回答 3

5

weak_ptr和明确支持您在上面所做的shared_ptr事情,当您尝试它时会发生什么?更准确地说,做你正在做的事情,不使用 null 删除器,然后根据需要使用标准行为weak_ptr将其转换为 a shared_ptr

boost::shared_ptr<X> it=myWeakPtr.lock();
if (it)
{
  // if the conversion succeeded, then the parent instance is still alive
}
于 2009-06-29T01:52:14.073 回答
2

有一个到weak_ptr的隐式转换,所以你可以使用

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

直接地。

还要检查 boost::shared_from_this 以便父级可以给自己一个指针,而无需显式存储一个weak_ptr。

否则,这似乎是拥有反向指针的正常方式。只需检查使用反向指针是否有真正的附加价值。

于 2009-06-29T11:01:03.237 回答
1

我会尝试做这样的事情:

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;
};
于 2009-06-29T04:11:11.457 回答