是否可以将const unique_ptr引用(派生类)转换为shared_ptr(基类)

时间:2019-01-04 20:51:21

标签: c++ smart-pointers

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来存储ProjectileEnemy对象并删除co​​nst限定符?

EntityBoundingBox的构造函数

EntityBoundingBox(std::shared_ptr<BoundingBox> boundingBox, std::shared_ptr<Entity> entity)

1 个答案:

答案 0 :(得分:2)

否,原因如下:如果只有unique_ptr<>const&,则无权延长引用对象的寿命。当您引用的基础unique_ptr消失时,该对象也会消失。但是,如果您拥有shared_ptr<>,则有权延长引用对象的寿命。因此,仅凭您所拥有的,就无法提供所需的东西。

思考一下为什么要将shared_ptr传递给某些代码可能会有所帮助。除非该代码可能需要延长引用对象的寿命,否则仅通过引用就更有意义。如果您传递的是shared_ptr,那是因为该代码可能会复制该shared_ptr并期望它延长对象的寿命。无论如何,如果有其他事情要破坏该对象,那将无法正常工作。