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)
答案 0 :(得分:2)
否,原因如下:如果只有unique_ptr<>const&
,则无权延长引用对象的寿命。当您引用的基础unique_ptr
消失时,该对象也会消失。但是,如果您拥有shared_ptr<>
,则有权延长引用对象的寿命。因此,仅凭您所拥有的,就无法提供所需的东西。
思考一下为什么要将shared_ptr
传递给某些代码可能会有所帮助。除非该代码可能需要延长引用对象的寿命,否则仅通过引用就更有意义。如果您传递的是shared_ptr
,那是因为该代码可能会复制该shared_ptr
并期望它延长对象的寿命。无论如何,如果有其他事情要破坏该对象,那将无法正常工作。