我有以下代码
class Task;
class Attribute
{
public:
Attribute(Task* task, std::string name);
std::shared_ptr<Task> task_;
std::string name_;
};
class Task : std::enable_shared_from_this<Task>
{
public:
std::shared_ptr<Task> getSharedPtr()
{
return this->shared_from_this();
}
Attribute att1_ = {this, "attribute1"};
Attribute att2_ = {this, "attribute2"};
};
Attribute::Attribute(Task* task, std::string name)
: name_(name)
{
task_ = task->getSharedPtr();
}
当我运行它时,我得到了一个
$ terminate called after throwing an instance of 'std::bad_weak_ptr'
从question我得到了我无法调用shared_from_this()
直到对象完全构造。
我想这意味着我无法在构造函数中创建Attribute
类型的对象,但我应该在构造函数结束后实例化它们。
你知道这是否是一种克服这个问题的方法,因为我必须实例化不在构造函数中的Attribute对象,这真的很烦人。
答案 0 :(得分:1)
根据this,我认为你违反了这条规则:
请注意,在对象t上调用shared_from_this之前,必须这样做 是一个拥有t的std :: shared_ptr。
您似乎在Task
和Attribute
之间存在奇怪的所有权关系,您可能需要重新考虑(如果Task
拥有其Attributes
,他们为什么需要{ {1}}到他们的shared_ptr
?)。
答案 1 :(得分:1)
由于Task
拥有 Attribute
,Attribute
不需要与Task
共享所有权 - 他们这样做不必担心Task
的寿命。你可以使用原始指针:
class Attribute
{
public:
Attribute(Task* task, std::string name);
Task* task_;
std::string name_;
};
或者,如果您想更明确地表达语义,observer_ptr<Task>
。
请注意,您必须拥有Task
的复制/移动构造函数/赋值运算符,才能正确地重新指定属性以指向新的Task
而不是旧的UITableviewCell
。
答案 2 :(得分:0)
当我在std :: enable_shared_from_this前面忘记了“public”时,我得到了同样的错误(在mac上)。