2017-03-12 35 views
0

通常不建议使用指针。但是,如果我有一个数据成员指向或引用此数据成员没有所有权的昂贵对象,并且此数据成员在构造过程中无法初始化(即,使该数据成员不是一个参考)。作为懒惰初始化中数据成员的昂贵对象的指针?

有什么更好的选择比让它成为指针?

如果我让这个数据成员成为一个指针,我还需要写自己的副本,赋值构造函数和析构函数吗?

+0

“*为此数据成员没有所有权*”那么,第一个问题:谁*拥有“昂贵的对象”的所有权? –

+0

@NicolBolas,其他一些班级。 – Allanqunzi

回答

0

更好的选择是使数据成员成为智能指针(shared_ptr)。

这样您就不必担心所有权:您创建昂贵的对象,然后将智能指针作为普通对象(复制或引用)传递。

当所有指向昂贵对象的shared_ptr实例都被销毁时,指向的对象也被销毁。

0

使用指针很好。一个好办法是使用智能指针,如std::unique_ptrstd::shared_ptr

在大多数情况下,您至少需要一个构造器来将资源分配给智能指针。其他功能取决于。

总之,你的班级应该是一个资源管理对象,用于“昂贵的对象”。 Ref:RAII

+0

请不要提及'std :: auto_ptr' – bolov

0

现有答案建议std::shared_ptr成员。这违反了问题中的“无所有权”要求。不过,还有另一个智能指针,std::weak_ptr。该指针不会导致所有权,因此它可以到期

弱指针具有复制构造函数和赋值运算符,并带有适当的语义。你的类的默认方法将使用这些。

weak_ptr的一个特点是你需要它们在使用共享资源时,因为如果资源在使用它们时过期会很糟糕。这就是为什么你不能简单地使用operator->