如何通过唯一指针获得多态行为?
How to obtain polymorphic behavior with unique pointers?
休息一段时间后开始使用 C++。
我有一个 std::vector
指向我迭代的对象的唯一指针,调用一个函数,该函数将基 class 作为参数,vector
中的对象从中派生,像这样:
for (auto const& object : objects)
{
_process(object);
}
其中 objects
将是:
std::vector<std::unique_ptr<Derived>>
我想了解如何强制执行多态行为来调用函数:
_process(std::unique_ptr<Base> base)
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
绝对没有问题。
休息一段时间后开始使用 C++。
我有一个 std::vector
指向我迭代的对象的唯一指针,调用一个函数,该函数将基 class 作为参数,vector
中的对象从中派生,像这样:
for (auto const& object : objects)
{
_process(object);
}
其中 objects
将是:
std::vector<std::unique_ptr<Derived>>
我想了解如何强制执行多态行为来调用函数:
_process(std::unique_ptr<Base> base)
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
绝对没有问题。