当我尝试运行此代码时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&
或使用std::shared_ptr
而不带std::enables_shared_from_this
或仅在最向上的类上使用。
#include <memory>
using namespace std;
class O {
public:
O() {}
};
struct A : virtual public O {
};
struct B : virtual O {
B() {}
void GetShared() {
}
};
struct C : std::enable_shared_from_this<C>, A, B {
C() = default;
};
int main()
{
std::shared_ptr<B> pt = std::make_shared<C>();
pt->GetShared();
}