C++ 从std::enable_shared_from_this继承的自身的自包含共享\u ptr

C++ 从std::enable_shared_from_this继承的自身的自包含共享\u ptr,c++,inheritance,smart-pointers,this-pointer,C++,Inheritance,Smart Pointers,This Pointer,此问题是此问题的后续问题: 我有一个从std::enable_shared_from_this继承的类,这个类包含一个std::shared_ptr 在我知道该类的详细信息完整且成功后,在该类的任何构造函数中,我如何将存储的std::shared_ptr分配为共享此的构造函数 例如: class Self : public std::enable_shared_from_this<Self> { private: std::shared_ptr<Self> me_

此问题是此问题的后续问题:

我有一个从
std::enable_shared_from_this
继承的类,这个类包含一个
std::shared_ptr

在我知道该类的详细信息完整且成功后,在该类的任何构造函数中,我如何将存储的
std::shared_ptr
分配为
共享此
的构造函数

例如:

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.
}
class Self:public std::从\u中启用\u共享\u{
私人:
std::shared\u ptr me\u;//或
std::unique_ptr>Self>me;
公众:
Self(/*某些参数*/);
};
Self::Self(/*一些参数*/){
//检查要创建的参数
//正在进行的一些工作或初始化
//如果一切顺利,这个班的建设就要开始了
//要离开作用域,请将智能指针设置为this*
//如何做。。。
me=std::从_this::从_this()启用_shared_;
//如果这是完全可能的话。
}

你不能。此时,指向当前
Self
实例的
共享\u ptr
还不存在。在构造函数返回之前,它不可能存在<代码>共享\u from_this()有一个先决条件,即
共享\u ptr
已经存在,指向

。此时,指向当前
Self
实例的
共享\u ptr
还不存在。在构造函数返回之前,它不可能存在
shared_from_this()
有一个先决条件,即指向此
shared_ptr
已经存在,因为您必须是指向当前对象的现有
std::shared_ptr
。如Scott Meyers在有效的现代C++中所说的(第19章),可以声明你的构造函数是私有的,并使工厂函数返回一个<代码> STD::SysDypPTR ,像:

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
};

您不能这样做,因为您必须是指向当前对象的现有
std::shared_ptr
。如Scott Meyers在有效的现代C++中所说的(第19章),可以声明你的构造函数是私有的,并使工厂函数返回一个<代码> STD::SysDypPTR ,像:

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
};

@那好吧。因此,它需要我有一个“管理器类型类”,其中包含它们的实例,或者我需要在函数中设置它,以便在其构造函数(如构造或初始化函数)之后立即调用。self的共享ptr是一个矛盾修饰法。仅用于暂时保持对象的活动状态(例如,在等待回调时)。@Jason R oh好的。因此,它需要我有一个“管理器类型类”,其中包含它们的实例,或者我需要在函数中设置它,以便在其构造函数(如构造或初始化函数)之后立即调用。self的共享ptr是一个矛盾修饰法。仅用于暂时保持对象的活动状态(例如,在等待回调时)。好的,这是有意义的。所以我需要一个包含共享指针的管理器类,或者在这个类中有一个需要在构造函数之后调用的方法,比如create()或init()方法。是的,从库的这一部分继承对我来说是新的。所以现在的问题是走哪条路。。。如果我使用manager类型类,那么就不需要让这个类从shared_从_this继承。更抽象一点的看待它的方式是,一个对象对自己的所有权没有发言权——它不能决定被共享。@JasonR“在构造函数返回之前,它不可能存在。”从技术上讲,您不能使用
std::shared\u ptr(this)
从ctor创建这样的指针。这可能是一种不好且危险的做法,我只是想说这看起来是可能的。好吧,这是有道理的。所以我需要一个包含共享指针的管理器类,或者在这个类中有一个需要在构造函数之后调用的方法,比如create()或init()方法。是的,从库的这一部分继承对我来说是新的。所以现在的问题是走哪条路。。。如果我使用manager类型类,那么就不需要让这个类从shared_从_this继承。更抽象一点的看待它的方式是,一个对象对自己的所有权没有发言权——它不能决定被共享。@JasonR“在构造函数返回之前,它不可能存在。”从技术上讲,您不能使用
std::shared\u ptr(this)
从ctor创建这样的指针。这可能是一个坏的和危险的做法,我只是想说这看起来是可能的。我认为这在技术上是可能的(尽管可能是一个糟糕的设计)。请看我对JasonR的评论。我认为这在技术上是可能的(尽管可能是一个糟糕的设计)。见我对JasonR的评论。