у меня есть 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()
что произойдет, когда счетчик ссылок достигнет нуля или реестр попытается его удалить.
У вас есть две несовместимые схемы владения.
Вам нужно либо изменить один из них, либо клонировать объект, который нужно перенести из одной схемы в другую.
Есть хитрость для освобождения shared_ptr
когда есть только одна ссылка на объект. Но ты не хочешь этого делать. Даже если вы знаете достаточно о внутренностях библиотеки, чтобы сделать это.
Так что, в качестве практического решения, измените пункт реестра.
Сделай так shared_ptr
,
Других решений пока нет …