C++ 正在构造函数中传递此的共享\u ptr
我有如下代码C++ 正在构造函数中传递此的共享\u ptr,c++,C++,我有如下代码 类任务; 类属性 { 公众: 属性(任务*任务,std::字符串名称); std::共享任务; std::字符串名称; }; 类任务:std::从\u中启用\u共享\u { 公众: std::shared_ptr getSharedPtr() { 从_this()返回此->共享_; } 属性att1{this,“attribute1”}; 属性att2{this,“attribute2”}; }; 属性::属性(任务*任务,标准::字符串名称) :姓名(姓名) { 任务\=task
类任务;
类属性
{
公众:
属性(任务*任务,std::字符串名称);
std::共享任务;
std::字符串名称;
};
类任务:std::从\u中启用\u共享\u
{
公众:
std::shared_ptr getSharedPtr()
{
从_this()返回此->共享_;
}
属性att1{this,“attribute1”};
属性att2{this,“attribute2”};
};
属性::属性(任务*任务,标准::字符串名称)
:姓名(姓名)
{
任务\=task->getSharedPtr();
}
当我运行它时,我得到一个
$ terminate called after throwing an instance of 'std::bad_weak_ptr'
因此,在对象完全构造之前,我无法从\u this()调用shared\u
。
我想这意味着我不能在构造函数中创建类型为Attribute
的对象,但应该在构造函数结束后实例化它们
您知道这是否是克服此问题的一种方法,因为必须实例化不在构造函数中的属性对象对我来说非常烦人。我认为您违反了此规则,如下所示: 请注意,在对象t上从_this调用shared_之前,必须 成为拥有t的std::shared_ptr
你似乎在
任务
和属性
之间有一种奇怪的所有权关系,你可能想重新考虑这种关系(如果任务
拥有其属性
,为什么他们需要共享其任务
?)。我认为你违反了这条规则,如下所示:
请注意,在对象t上从_this调用shared_之前,必须
成为拥有t的std::shared_ptr
你似乎在任务
和属性
之间有一种奇怪的所有权关系,你可能想重新考虑这种关系(如果任务
拥有其属性
,为什么他们需要共享其任务
?)。既然任务
拥有属性
,属性
不需要与任务
共享所有权-它们不必担心任务
的寿命。您可以只使用原始指针:
class Attribute
{
public:
Attribute(Task* task, std::string name);
Task* task_;
std::string name_;
};
或者,如果您想更明确地表达语义,observer\u ptr
请注意,您必须为任务
设置一个复制/移动构造函数/赋值运算符,以便正确地重新分配属性以指向新的任务
,而不是旧的任务 由于任务
拥有属性
s,因此属性
s不需要与任务
共享所有权-他们不必担心任务
的寿命。您可以只使用原始指针:
class Attribute
{
public:
Attribute(Task* task, std::string name);
Task* task_;
std::string name_;
};
或者,如果您想更明确地表达语义,observer\u ptr
请注意,您必须为
任务
设置一个复制/移动构造函数/赋值运算符,以便正确地重新分配属性以指向新的任务
,而不是旧的任务 当我在std::enable_shared_from_this前面忘记了“public”时,我(在mac上)收到了非常相同的错误。当我忘记了“public”时,我(在mac上)收到了非常相同的错误在std::enable_shared_from_this.是由std::shared_ptr
管理的Task
对象吗?为什么不能将Task
作为const std::shared_ptr&
传递给构造函数?任务是否由std::shared_ptr
管理?为什么不能将Task
作为const传递给构造函数std::shared_ptr&
给你的构造函数?我想你是对的,我想我刚刚经历了一次智能指针的狂热!我想你是对的,我想我刚刚经历了一次智能指针的疯狂!