【问题标题】:Constructor expecting shared pointer to the instance being created构造函数期望指向正在创建的实例的共享指针
【发布时间】:2014-04-10 17:47:51
【问题描述】:

我遇到了一个需要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的值?

【问题讨论】:

  • 为什么有人会将weak_ptr传递给自己?你想做什么?因为它是在 ctor 中创建的,所以您无论如何都不能将它集中到一个 ctor 中
  • 您是否要重新创建std::enable_shared_from_this
  • 我对 C++11 还是很陌生,不知何故我不知道 std::enable_shared_from_this。乍一看,这似乎是一个完美的解决方案。

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


【解决方案1】:

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

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

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

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

struct SomeClass : public std::enable_shared_from_this<SomeClass>
{
    std::shared_ptr<SomeClass> create()
    { return std::make_shared<SomeClass>(); }

private:
    SomeClass()
    {}
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2012-09-27
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    相关资源
    最近更新 更多