c++ - 从强制转换的 std::shared_ptr 创建对象实例
问题描述
我有一个包含一组共享指针的向量:
std::vector<std::shared_ptr<Derived>> originalVector;
在某些时候它转换为Base
共享指针,它看起来像:
std::vector<std::shared_ptr<Base>>* castedVector = reinterpret_cast<std::vector<std::shared_ptr<Base>>*>(&originalVector);
如何将Derived
项目添加到铸造矢量?显然我可以在其中放置一个空std::shared_ptr
,这个新的共享指针是否知道它所拥有的类型,它可以创建这种类型的对象吗?
更新:shared_ptr
在转换为基类后无法创建原始对象。转换后,它丢失了有关原始基础类型的所有信息。此外:这reinterpret_cast
是未定义的行为。
解决方案
std::vector<std::shared_ptr<Base>>* castedVector =
reinterpret_cast<std::vector<std::shared_ptr<Base>>*>(&originalVector);
这是未定义的行为,不要这样做。
您可以通过复制而不是欺骗类型系统来创建vector
指向 base 的指针:
std::vector<std::shared_ptr<Base>> baseVector(originalVector.begin(), originalVector.end());
这包含原始指针的副本,它们与它们共享所有权,但包含的指针Base*
不是Derived*
.
显然,如果你在其中插入一个新值originalVector
,它就不会出现在 中baseVector
,所以你需要制作一个整体的新副本originalVector
,或者同时将它插入到两者中。
推荐阅读
- java - 春天
我有一个控制器,
@PreAuthorize("hasAnyRole('USER')")
当我尝试渲染页面的某些特定部分时,<security:authorize url="path-to-controller">
即使登录用户- go - 如何将 []byte 解组为 json 结构,该结构存储为字符串类型变量中的值?
- javascript - 检查对象并对所有匹配的子节点执行修改
- javascript - 是否可以将 Ajax 调用存储为对象?
- c# - 索引超出范围....但它似乎并没有超出范围,这是怎么回事?
- javascript - 为什么 Firebase 显示无法解析 rxjs/observable 的错误
- ios - 尝试在 React Native 项目中打开 .xcworkspace 时 Xcode 崩溃
- android - Ionic 3 - 将插件添加到 build.gradle 文件
- javascript - 当我只知道父类的名称时使用类
- python - Facebook登录在同一个选项卡中打开而不是在弹出窗口中