如何在 C++ 中维护指向父级的弱指针?

发布于 2024-07-25 15:01:19 字数 417 浏览 6 评论 0原文

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

Is there a standard way of maintaining a weak pointer to a parent (which is created using a shared pointer) in a child object in C++?

Essentially, I need to implement something on the lines of the following:

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;
};

In the above all instances of class B need to hold a weak pointer to their parent (i.e object of class A). Class A objects are instantiated using a shared_ptr. I can think of a solution that uses a null deleter. But is that a standard way of doing something like this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

雅心素梦 2024-08-01 15:01:20

有隐式转换为weak_ptr,所以可以

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

直接使用。

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

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

There is an implicit conversion to weak_ptr, so you can use

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

directly.

check also boost::shared_from_this so the parent can give a pointer to himself without storing a weak_ptr explicitly.

Otherwise, this seems like a normal way to have a back-pointer. Just check whether there is a real added value in using back-pointers.

や三分注定 2024-08-01 15:01:20

我会尝试做这样的事情:

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;
};

I would try to do something like this:

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;
};
汐鸠 2024-08-01 15:01:19

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

boost::shared_ptr<X> it=myWeakPtr.lock();
if (it)
{
  // if the conversion succeeded, then the parent instance is still alive
}

What you are doing above is explicitly supported by weak_ptr and shared_ptr, what happens when you try it? To be more precise, do what you are doing, without the null deleter, and then you use the standard behaviour on the weak_ptr to convert it to a shared_ptr as needed:

boost::shared_ptr<X> it=myWeakPtr.lock();
if (it)
{
  // if the conversion succeeded, then the parent instance is still alive
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文