通常不建议使用指针。但是,如果我有一个数据成员指向或引用此数据成员没有所有权的昂贵对象,并且此数据成员在构造过程中无法初始化(即,使该数据成员不是一个参考)。作为懒惰初始化中数据成员的昂贵对象的指针?
有什么更好的选择比让它成为指针?
如果我让这个数据成员成为一个指针,我还需要写自己的副本,赋值构造函数和析构函数吗?
通常不建议使用指针。但是,如果我有一个数据成员指向或引用此数据成员没有所有权的昂贵对象,并且此数据成员在构造过程中无法初始化(即,使该数据成员不是一个参考)。作为懒惰初始化中数据成员的昂贵对象的指针?
有什么更好的选择比让它成为指针?
如果我让这个数据成员成为一个指针,我还需要写自己的副本,赋值构造函数和析构函数吗?
更好的选择是使数据成员成为智能指针(shared_ptr)。
这样您就不必担心所有权:您创建昂贵的对象,然后将智能指针作为普通对象(复制或引用)传递。
当所有指向昂贵对象的shared_ptr实例都被销毁时,指向的对象也被销毁。
现有答案建议std::shared_ptr
成员。这违反了问题中的“无所有权”要求。不过,还有另一个智能指针,std::weak_ptr
。该指针不会导致所有权,因此它可以到期。
弱指针具有复制构造函数和赋值运算符,并带有适当的语义。你的类的默认方法将使用这些。
weak_ptr
的一个特点是你需要锁它们在使用共享资源时,因为如果资源在使用它们时过期会很糟糕。这就是为什么你不能简单地使用operator->
。
“*为此数据成员没有所有权*”那么,第一个问题:谁*拥有“昂贵的对象”的所有权? –
@NicolBolas,其他一些班级。 – Allanqunzi