休息一会儿再玩C ++。
我有一个std::vector
指向要迭代的对象的唯一指针,调用一个函数,该函数将派生vector
中的对象的基类作为参数,例如:>
for (auto const& object : objects)
{
_process(object);
}
其中objects
将是:
std::vector<std::unique_ptr<Derived>>
我想了解如何执行多态行为来调用该函数:
_process(std::unique_ptr<Base> base)
答案 0 :(得分:3)
std::unique_ptr
代表所有权,因此无法复制。
这意味着_process(std::unique_ptr<Base> base)
是一个接收器,即它消耗对象(它可以销毁它或将其存储在某个位置,但调用者无法再对其进行控制了)。要调用它,您必须使用std::move
:
_process(std::move(object))
这样,您将明确拒绝对该对象的所有权,并从容器中将其基本上删除-指针将重置为nullptr
。
自然,只能通过非const
引用来完成。
如果您不想转让所有权,而只想对对象做某事-名称_process
似乎暗示了-您应该传递常规的原始指针:
_process(Base* base);
...
for (auto const& object : objects)
{
_process(object.get());
}
除了控制对象的生存期外,原始指针对于所有事情仍然非常有用。
在两种情况下(原始指针和unique_ptr
),从Derived
隐式转换为Base
都应该没有问题。