其他分享
首页 > 其他分享> > c – std :: enable_shared_from_this;公共与私人

c – std :: enable_shared_from_this;公共与私人

作者:互联网

我正在玩一些使用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公开更改为固有的,这只是查找.

为什么,我在这里想念什么?并没有办法使它适用于私有继承,因为shared_test类的“外部世界”不需要知道它是否允许共享…(至少,如果你问我,还是我又想念一些东西?)

解决方法:

Why is that, what do I miss here?

要使shared_from_this工作,enable_shared_from_this必须知道保存该类的shared_ptr.在您的STL实现中,它是weak_ptr,通过其他实现是可能的.当您私下继承时,则无法从类外部访问基类的属性.实际上甚至不可能理解你继承了.因此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,c11,shared-ptr,private-inheritance,enable-shared-from-this
来源: https://codeday.me/bug/20191002/1843221.html