如何将shared_ptr传递给裸 ptr 函数

How to pass shared_ptr to naked ptr function

本文关键字:ptr 函数 shared      更新时间:2023-10-16

我有一个由库定义的Entity类,Registry该类是管理使用映射注册到它的实体的类。

我想做什么:

//Registry Signature
void Registry::add(Entity* entity);

//my function (IGameEntity subclasses Entity)
void GameLogic::addEntity(shared_ptr<IGameEntity> entity, GameEntityId id) {
 GameEntityId entityId = entity->getId();
 gameEntities.push_back(entity);
 Framework::Registry::instance()->add(entity); //<-- this doesn't work
}

我正在尝试弄清楚如何处理这个问题,因为我保留了shared_ptr,然后我将不得不传递一个指针。

另一件事是,如果注册表因某种原因被销毁,它将对映射中剩余的所有实体调用delete

如果我通过entity weak_ptr<Entity>(entity)它可以工作,但我没有完全掌握如果Registry调用删除weak_ptr会发生什么。

如果我通过entity entity.get()当引用计数达到零或注册表尝试删除它时会发生什么。

您有两个不兼容的所有权方案。

您需要更改其中一个方案,或者克隆应从一个方案传输到另一个方案的对象。

当只有一个对对象的引用时,有一个技巧可以释放shared_ptr。但你不想那样做。即使您对图书馆内部有足够的了解来做到这一点。

因此,作为一个实用的解决方案,更改注册表。

让它需要shared_ptr.