当前位置:  开发笔记 > 编程语言 > 正文

std :: enable_shared_from_this :: shared_from_this如何工作

如何解决《std::enable_shared_from_this::shared_from_this如何工作》经验,为你挑选了1个好方法。

我无法理解如何std::enable_shared_from_this::shared_from_this返回与现有指针共享所有权的共享pinter.换句话说,你做这个:

std::shared_ptr getFoo() { return shared_from_this(); }

因此,当你打电话时,getFoo它是如何得到另一个shared_ptr共享所有权的另一个,而不是创建一个shared_ptr拥有相同的独立this.

我需要理解这一点,以便能够理解如何从某个对象创建shared_ptr,这些对象都会增加相同的引用计数而不会初始化单独的shared_ptrs.



1> Simple..:

enable_shared_from_this有一个weak_ptr数据成员.该shared_ptr如果构造可以检测到T源自enable_shared_from_this.如果是,则shared_ptr构造函数将*this(在哪个位置shared_ptr)分配给weak_ptr数据成员enable_shared_from_this.shared_from_this()可以创建一个shared_ptrweak_ptr.

可能的实现示例:

template
class enable_shared_from_this {
protected:
    constexpr enable_shared_from_this() { }
    enable_shared_from_this(enable_shared_from_this const&) { }
    enable_shared_from_this& operator=(enable_shared_from_this const&) {
        return *this;
    }

public:
    shared_ptr shared_from_this() { return self_.lock(); }
    shared_ptr shared_from_this() const { return self_.lock(); }

private:
    weak_ptr self_;

    friend shared_ptr;
};

template
shared_ptr::shared_ptr(T* ptr) {
    // ...
    // Code that creates control block goes here.
    // ...

    // NOTE: This if check is pseudo-code. Won't compile. There's a few
    // issues not being taken in to account that would make this example
    // rather noisy.
    if (is_base_of, T>::value) {
        enable_shared_from_this& base = *ptr;
        base.self_ = *this;
    }
}


@Narek它可能是一个"朋友".
推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有