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&
给你的构造函数?我想你是对的,我想我刚刚经历了一次智能指针的狂热!我想你是对的,我想我刚刚经历了一次智能指针的疯狂!