构造函数期望共享指向正在创建的实例的指针

时间:2014-03-07 14:15:37

标签: c++ c++11 shared-ptr smart-pointers

我遇到了一个需要std::weak_ptr作为构造函数参数的类。问题是弱指针必须指向拥有正在创建的实例的shared_ptr。我无法弄清楚如何传递所述指针,因为shared_ptr本身仅在构造类之后被构造或赋值。

struct SomeClass
{
    SomeClass(std::weak_ptr<SomeClass> ptrToThis){...}
    ...
};

我已经尝试了以下方法将weak_ptr传递给构造函数,但它失败了(我认为这是因为原来的shared_ptr在分配后不再在内部使用相同的句子对象了)

int main()
{
    std::shared_ptr<SomeClass> shared;
    std::weak_ptr<SomeClass> weak;
    weak = shared;
    shared = std::make_shared<SomeClass>(weak);
    //this prints "1" (true)
    std::cout << weak.expired();
    return 0;
}

怎么能纠正这个?由于我可以修改原始类,我应该以某种方式修改它,例如在构造之后添加一个单独的函数来设置weak_ptr的值吗?

1 个答案:

答案 0 :(得分:3)

您可能最好使用专为此类情况设计的std::enable_shared_from_this

要使用它,从中派生你的类。它将存储一个std::weak_ptr,它将在第一次创建指向该对象的std::shared_ptr时初始化为指向该对象:

struct SomeClass : public std::enable_shared_from_this<SomeClass>
{
  //...
};

如果您需要确保您的类的std::shared_ptr始终存在,您可以将其所有构造函数设置为私有(或受保护,如果适用),并为其提供一个公共静态创建函数,返回{{1} }:

std::shared_ptr