这个问题是这个问题的后续问题:原始问题
我有一个继承自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.
}
。此时,指向当前Self
实例的shared_ptr
尚不存在。在构造函数返回之前,它不可能存在。 shared_from_this()
有一个前提条件,即指向this
的shared_ptr
已经存在。
因为您必须是指向当前对象的现有std::shared_ptr
。正如 Scott Meyers 在 Effective Modern C++(第 19 章)中所说,你可以声明你的构造函数私有,并使工厂函数返回一个 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();
}