这个问题是这个问题的后续问题: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.
}
答案 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();
}