唯一的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());
}
答案 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
为它的“父”,以避免内存泄漏。