c++ - 如何获得具有唯一指针的多态行为?
问题描述
在较长的休息后玩弄 C++。
我有一个std::vector
指向我迭代的对象的唯一指针,调用一个函数,该函数将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
推荐阅读
- javascript - 如何在 php 文件中显示以下数据
- ruby-on-rails - 在 HTTP 上下文之外调度 Rails 控制器操作(不在单元测试中)
- android-espresso - Android Espresso:如何检查 EditText 的“drawableStart”?
- javascript - 使用 javascript 正则表达式更改图像 url 中的高度和宽度
- java - HttpUnit - 如何使用 getTextBlocks
- php - Symfony 3 - 在我的服务 args 中添加 security.authorization_checker 会导致重定向过多
- angular - Angular 5 属性指令不适用于鼠标事件
- java - java.lang.InstantiationException 第二次
- python-3.4 - Python - 从文件中读取整数并在操作后将其替换为同一文件
- python - 如何在 python 中抑制 PDFMiner 的布局分析