【发布时间】:2019-01-04 20:51:20
【问题描述】:
std::vector<std::unique_ptr<Projectile>> const& projectiles = m_projectileManager->GetProjectiles();
std::vector<std::vector<std::unique_ptr<Enemy>>> const& enemies = m_enemyManager->GetEnemies();
std::vector<std::unique_ptr<EntityBoundingBox>> boundingBoxes;
for (std::unique_ptr<Projectile>const& projectile : projectiles) {
std::shared_ptr<Entity> entity = std::move(projectile); //error
std::unique_ptr<EntityBoundingBox> boundingBox = std::make_unique<EntityBoundingBox>(projectile->GetBoundingBox(), entity);
boundingBoxes.push_back(std::move(boundingBox));
}
我正在尝试创建一个新对象 EntityBoundingBox,但我需要保留对原始 Entity 的引用以确定与什么发生冲突,但由于我对实体使用 unique_ptr,所以我可以'似乎没有把它们传给新班级。另外我正在尝试存储Entity 类型,它是Projectile 的基类
有没有办法做到这一点,而无需从 unique_ptr 更改为 shared_ptr 来存储 Projectile 和 Enemy 对象并删除 const 限定符?
EntityBoundingBox 的构造函数
EntityBoundingBox(std::shared_ptr<BoundingBox> boundingBox, std::shared_ptr<Entity> entity)
【问题讨论】:
-
否,因为对 const 限定
std::unique_ptr的引用无法释放指针的所有权。 -
好吧,如果其他东西也存储了一个指向射弹的拥有指针,那么
unique_ptr不再是唯一的所有者...... -
换个角度看,你不能共享一个唯一对象的所有权。有问题的不是派生/基础指针部分
-
你可以从
unique_ptr创建一个shared_ptr如果你的std::moveunique_ptr变成shared_ptr。但是正如@VTT 所提到的,如果您的unique_ptr是const并且在保留原始unique_ptr的同时无法做到这一点(它不再是唯一的所有者),这是不允许的。
标签: c++ smart-pointers