gpt4 book ai didi

c++ - std::enable_shared_from_this;公共(public)与私有(private)

转载 作者:IT老高 更新时间:2023-10-28 22:38:03 25 4
gpt4 key购买 nike

我使用 shared_ptr 和 enable_shared_from_this 玩了一会儿,但遇到了一些我不太了解的东西。

在我的第一次尝试中,我构建了这样的东西:

class shared_test : std::enable_shared_from_this<shared_test> {
public:
void print(bool recursive) {
if (recursive) {
shared_from_this()->print(false);
}

std::cout << "printing" << std::endl;
}
};

请注意,这个类正在私下扩展 std::enable_shared_from_this。这显然有很大的不同,因为执行这样的事情:

int main() {
auto t(std::make_shared<shared_test>());
t->print(true);
return 0;
}

抛出一个 bad_weak_ptr 异常。好像我将类定义更改为从 std::enable_shared_from_this 公开的固有的,这只是查找。

为什么会这样,我在这里想念什么?并且没有办法使它适用于私有(private)继承,因为 shared_test 类的“外部世界”不需要知道它正在启用共享......(至少,如果你问我,还是我又错过了什么?)

最佳答案

Why is that, what do I miss here?

要使 shared_from_this 工作,enable_shared_from_this 必须知道持有该类的 shared_ptr。在您的 STL 实现中,它是 weak_ptr,通过其他实现也是可能的。当您私有(private)继承时,就无法从类外部访问基类的属性。实际上,甚至不可能理解你是从那里继承下来的。所以 make_shared 会生成通常的 shared_ptr 初始化,而无需在 enable_shared_from_this 中设置适当的字段。

不是从 make_shared 而是从 shared_from_this 引发异常,因为 enable_shared_from_this 未正确初始化。

And isn't there a way to make it work for private inheritance, since the 'outside world' of the shared_test class does not need to know that it is enabling shared from this...

没有。外部世界必须知道该对象与 shared_ptr 有特殊关系才能正常工作。

关于c++ - std::enable_shared_from_this;公共(public)与私有(private),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39937112/

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