在构造函数中传递this的shared_ptr

时间:2016-05-27 12:55:23

标签: c++

我有以下代码

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对象,这真的很烦人。

3 个答案:

答案 0 :(得分:1)

根据this,我认为你违反了这条规则:

  

请注意,在对象t上调用shared_from_this之前,必须这样做   是一个拥有t的std :: shared_ptr。

您似乎在TaskAttribute之间存在奇怪的所有权关系,您可能需要重新考虑(如果Task拥有其Attributes,他们为什么需要{ {1}}到他们的shared_ptr?)。

答案 1 :(得分:1)

由于Task 拥有 AttributeAttribute不需要与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上)。