如何将唯一的ptr类传递给其成员对象的实例指针

时间:2015-09-12 22:17:51

标签: c++ c++11 smart-pointers

唯一的ptr类应该如何将其实例指针传递给其成员对象。 我想出了以下方法,想知道是否有更好的方法。 在以下示例中,对象f将其实例ptr作为原始指针传递给其成员对象。我想知道这是否正常,或者有更好更安全的方法吗?

class bar;

struct foo
{
    std::unique_ptr<bar> bar_ptr;    
};

struct bar
{
   const foo* raw_foo_ptr;
   bar()  {   }
   void setfoo(const foo* p)
   {raw_foo_ptr = p;}
};

int main()
{
    std::unique_ptr<foo> f(new foo());
    f->bar_ptr.reset(new bar());
    f->bar_ptr->setfoo(f.get());
}

2 个答案:

答案 0 :(得分:2)

我认为在这种情况下,foo明确拥有bar并且明显比bar更长,然后一个非拥有的原始指针指向foo这可以。

虽然,我可能会略有不同。如果可能的话,我会在构造时设置后退指针,如果可用,我会使用std::make_unique

class bar;

struct foo
{
    std::unique_ptr<bar> bar_ptr;    
};

struct bar
{
   const foo* raw_foo_ptr;
   bar(const foo* p) : raw_foo_ptr(p) { }
};

int main()
{
    auto f = std::make_unique<foo>();
    f->bar_ptr = std::make_unique<bar>(f.get());
}

答案 1 :(得分:0)

由于您的指针不是唯一的(您希望您的对象由多个指针管理),因此您应该使用std::shared_ptr。在这种情况下,bar实例应该weak_ptr为它的“父”,以避免内存泄漏。