std :: enable_shared_from_this是否在构造函数中初始化?

时间:2019-03-30 13:05:29

标签: c++ class std shared-ptr

我有2个类:父类和子类,每个类都具有shared_ptr,我在构造过程中初始化了子类。

代码无法编译,错误消息为:

  

错误C2664:'Parent :: Parent(Parent &&)':无法转换参数1   从'_Ty'到'const Parent&'

下面的示例说明了该问题。 问题是,我该怎么做才能使以下代码编译:

#include <memory>

class Child;

class Parent :
    public std::enable_shared_from_this<Parent>
{
public:
    Parent()
    {
        mpChild = std::make_shared<Child>(
                 std::make_shared<Parent>(shared_from_this()));
    }
private:
    std::shared_ptr<Child> mpChild;
};

class Child
{
public:
    Child(std::shared_ptr<Parent> parent) :
        mpParent(parent) { }

private:
    std::shared_ptr<Parent> mpParent;
};

int main()
{
    Parent test; // error C2664
    return 0;
}

1 个答案:

答案 0 :(得分:0)

我遇到了另一个错误,但是复制,粘贴和编译代码使我在以下语句上出现错误,并且我同意编译器该语句很奇怪:

  

mpChild = std::make_shared<Child>( std::make_shared<Parent>(shared_from_this()));

上下文是这是在Parent的构造函数中。让我们从内到外地工作(首先评估到最后评估)。最里面的调用是shared_from_this(),它返回一个shared_ptr。然后,此值是std::make_shared<Parent>的输入。也就是说,make_shared应该为新的Parent对象分配内存,然后通过调用将Parent作为参数的shared_ptr构造函数来初始化它。

有一个问题。实际上是几个,但是表面上的是Parent没有采用shared_ptr的构造函数。因此编译失败。

第二个问题是Parent的构造函数正在构造一个新的Parent对象,如果算出了语法,它看起来像是无限递归。