gpt4 book ai didi

c++ - std::enable_shared_from_this<> 和多重继承

转载 作者:行者123 更新时间:2023-12-03 07:03:38 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Double inheritance of enable_shared_from_this

(3 个回答)


1年前关闭。




当我尝试运行此代码时,我得到 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 因为这是其他接口(interface)所需要的。有没有办法修复这个代码?我似乎无法做到这一点。

最佳答案

好吧,据我所知,您正在尝试执行可撤消的操作:
C++ 中的继承意味着您还包括父类的相同成员。然而对于 class C这意味着 2 个类(class)应该由 std::shared_ptr 举办.但是通过继承你告诉编译器 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或仅在最高级的类(class)中。

#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();
}

关于c++ - std::enable_shared_from_this<> 和多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64204729/

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