gpt4 book ai didi

c++ - 在基类中调用 shared_from_this() 时的 bad_weak_ptr

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:47 25 4
gpt4 key购买 nike

我有一个 SuperParent 类,一个 Parent 类(派生自 SuperParent)并且都包含一个 shared_ptr到一个 Child 类(它包含一个 weak_ptr 到一个 SuperParent)。不幸的是,我在尝试设置 Child 的指针时遇到了 bad_weak_ptr 异常。代码如下:

#include <boost/enable_shared_from_this.hpp>
#include <boost/make_shared.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>

using namespace boost;

class SuperParent;

class Child {
public:
void SetParent(shared_ptr<SuperParent> parent)
{
parent_ = parent;
}
private:
weak_ptr<SuperParent> parent_;
};

class SuperParent : public enable_shared_from_this<SuperParent> {
protected:
void InformChild(shared_ptr<Child> grandson)
{
grandson->SetParent(shared_from_this());
grandson_ = grandson;
}
private:
shared_ptr<Child> grandson_;
};

class Parent : public SuperParent, public enable_shared_from_this<Parent> {
public:
void Init()
{
child_ = make_shared<Child>();
InformChild(child_);
}
private:
shared_ptr<Child> child_;
};

int main()
{
shared_ptr<Parent> parent = make_shared<Parent>();
parent->Init();
return 0;
}

最佳答案

这是因为你的Parent类继承了两次enable_shared_from_this。相反,您应该继承它一次——通过 SuperParent。如果你想在 Parent 类中获得 shared_ptr< Parent >,你也可以从以下帮助类继承它:

template<class Derived> 
class enable_shared_from_This
{
public:
typedef boost::shared_ptr<Derived> Ptr;

Ptr shared_from_This()
{
return boost::static_pointer_cast<Derived>(static_cast<Derived *>(this)->shared_from_this());
}
Ptr shared_from_This() const
{
return boost::static_pointer_cast<Derived>(static_cast<Derived *>(this)->shared_from_this());
}
};

然后,

class Parent : public SuperParent, public enable_shared_from_This<Parent>

关于c++ - 在基类中调用 shared_from_this() 时的 bad_weak_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9374610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com