Self包含自己的shared_ptr,它继承自std :: enable_shared_from_this

时间:2017-01-16 19:28:04

标签: c++ inheritance smart-pointers this-pointer

这个问题是这个问题的后续问题:original question

我有一个继承自std::enable_shared_from_this的类,此类包含std::shared_ptr<Self>

在我知道该类的详细信息是完整且成功的之后,在该类的任何构造函数中,如何将存储的std::shared_ptr<Self>指定为shared this

示例:

class Self : public std::enable_shared_from_this<Self> {
private:
    std::shared_ptr<Self> me_; // Or
    std::unique_ptr>Self> me_;

public:
    Self ( /*some parameters*/ );
};

Self::Self( /* some parameters */ ) {
    // Check parameters for creation

    // Some work or initialization being done

    // If all is successful and construction of this class is about
    // to leave scope, then set the smart pointer to the this*

    // How to do ...
    me_ = std::enable_shared_from_this<Self>::shared_from_this();
    // Properly if this is even possible at all.
}

2 个答案:

答案 0 :(得分:2)

你不能。此时,指向当前shared_ptr实例的Self尚未存在。在构造函数返回之前,它可能不存在。 shared_from_this()的前提条件是shared_ptr已存在,指向this

答案 1 :(得分:1)

您不能因为您必须是指向当前对象的现有std::shared_ptr。正如Scott Meyers在Effective Modern C ++(第19章)中所说,你可以将构造函数声明为private,并使工厂函数返回std::shared_ptr,如:

class Self: public std::enable_shared_from_this<Self> {
public:
// factory function that perfect-forwards args
// to a private ctor
    template<typename... Ts>
    static std::shared_ptr<Self> create(Ts&&... params);
    ...
    void process();
    ...
private:
    ... // ctors
};

然后拨打process,这可能是:

void Self::process() 
{
    ... 
    me_ = shared_from_this();
}