Как передать shared_ptr в функцию naked ptr

у меня есть Entity класс, определенный библиотекой lib, и 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 вызовы удалить на слабых_птр.

И если я пройду entity имеет entity.get() что произойдет, когда счетчик ссылок достигнет нуля или реестр попытается его удалить.

0

Решение

У вас есть две несовместимые схемы владения.

Вам нужно либо изменить один из них, либо клонировать объект, который нужно перенести из одной схемы в другую.

Есть хитрость для освобождения shared_ptr когда есть только одна ссылка на объект. Но ты не хочешь этого делать. Даже если вы знаете достаточно о внутренностях библиотеки, чтобы сделать это.

Так что, в качестве практического решения, измените пункт реестра.

Сделай так shared_ptr,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]