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


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对象并删除 const 限定符?

EntityBoundingBox的构造函数

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

不,原因如下:如果你只有一个unique_ptr<>const&,你无权延长被引用对象的寿命。当您引用的基础unique_ptr消失时,对象也会消失。但是如果你有一个shared_ptr<>,你确实有权延长被引用对象的寿命。因此,只用你所拥有的,你不能给予所需要的。

思考一下为什么要将shared_ptr传递给某些代码段可能会有所帮助。除非该代码可能需要延长引用对象的生存期,否则仅传递引用更有意义。如果您正在传递一个shared_ptr,那是因为该代码可能会复制该shared_ptr并期望它延长对象的寿命。如果其他东西无论如何都会破坏物体,那是不可能的。

相关内容

  • 没有找到相关文章

最新更新