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