问题描述
当我尝试运行此代码时,我得到bad_weak_ptr异常:
using namespace std;
class O {
public:
O() {}
};
class A : public std::enable_shared_from_this<A>,virtual public O {
public:
A() {}
};
class B : public std::enable_shared_from_this<B>,virtual public O {
public:
B() {}
void GetShared() {
shared_from_this();
}
};
class C : public A,public B {
public:
C() {}
};
int main()
{
std::shared_ptr<B> pt = std::make_shared<C>();
pt->GetShared();
}
我想创建C类的实例,但随后返回B shared_ptr,因为这是其他接口所需要的。有没有办法解决此代码?我似乎无法做到这一点。
解决方法
据我所知,您正在尝试做不可撤销的事情:
C ++中的继承意味着您还包括父类的相同成员。但是,对于class C
来说,这意味着应该由std::shared_ptr
保留2个类。但是通过继承,您可以告诉编译器C应该包含A
不包含的B
和std::shared_ptr
的子实例。 shared_from_this
在运行时会因为严重的弱ptr异常而抱怨这一事实。
可能您希望C仅由std::shared_ptr
持有,然后可以转到附加的代码。
如果您只是想“上传” C
的实例(即使用它,因为它是B
的类,则可以简单地使用B&
或使用{{ 1}}中没有std::shared_ptr
,或者仅在最高级别的课程中。
std::enables_shared_from_this