C++ std::从\u this启用\u共享\u<&燃气轮机;和多重继承
当我尝试运行此代码时,会出现坏的\u弱的\u ptr异常:C++ std::从\u this启用\u共享\u<&燃气轮机;和多重继承,c++,pointers,C++,Pointers,当我尝试运行此代码时,会出现坏的\u弱的\u 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&l
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();
}
使用名称空间std;
O类{
公众:
O(){}
};
A类:公共std::从虚拟公共O启用共享{
公众:
A(){}
};
B类:公共std::从虚拟公共O启用共享{
公众:
B(){}
void GetShared(){
从_this()共享_;
}
};
C类:公共A、公共B{
公众:
C(){}
};
int main()
{
std::shared_ptr pt=std::make_shared();
pt->GetShared();
}
我想创建C类的实例,但随后返回B shared_ptr,因为这是其他接口所需要的。有没有办法修复此代码?我似乎无法做到这一点。据我所知,您正试图完成可撤销的任务: <> C++中的继承意味着你也包含父类的相同成员。然而,对于
C类
,这意味着两个类已经被std::shared\u ptr
持有。但是通过继承,您告诉编译器C应该包含A
和B
的子实例,而不是由std::shared\u ptr
持有<代码>共享\u来自\u此将在运行时通过错误的弱ptr异常来抱怨这一事实
可能您希望C仅由一个std::shared\u ptr
持有,然后您可以将其添加到附加的代码中
如果您只想“向上投射”一个C
的实例,即将其用作B
的一个类,您可以简单地使用B&
或使用std::shared\u ptr
而不使用std::从该或仅在最上面的类上启用共享
#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();
}
#包括
使用名称空间std;
O类{
公众:
O(){}
};
结构A:虚拟公共对象{
};
结构B:虚拟O{
B(){}
void GetShared(){
}
};
结构C:std::从这个,A,B启用共享{
C()=默认值;
};
int main()
{
std::shared_ptr pt=std::make_shared();
pt->GetShared();
}
这是个不错的问题,但请包括必要的标题。