如何正确地使一个对象拥有另一个多态对象?

时间:2019-01-27 00:54:39

标签: c++ pointers move-semantics unique-ptr ownership

我正在寻找一种保存干净的方法,使一个对象拥有另一个(多态!)对象,并在构造函数中对其进行初始化。 另外,我想使用吸气剂来访问它。

在SO上浏览了多个博客和帖子后,我认为最好使用std::unique_ptr并找出来:

#include <memory>

class owned {};

class owner {
    const std::unique_ptr<const owned> m_owned;
public:
    owner(std::unique_ptr<const owned>&& o) : m_owned{ std::move(o) } {}
    const owned& owned() const { return *m_owned; }
};

int main() {
    std::unique_ptr<owned> _owned{ std::make_unique<owned>(owned()) };
    owner _owner(std::move(_owned));
}

但是,我对std::unique_ptr的详细信息不是很熟悉,因此不确定这是否是实现我的想法的好方法。尤其是std::move的双重使用使我感到怀疑……

问题是:这是将多态对象的所有权转移到另一个对象并使其可访问的首选方法吗?如果不是,那么 的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

看起来不错。我将&&放在一个地方:

owner(std::unique_ptr<const owned> o) :

因为不需要。

一个陷阱;如果添加owner(owner&&)=default;,则owned有时可以为空。因此,检测该状态的方法很好。