У меня есть следующий фрагмент кода в моем entityManager.Запрос относительно правильного использования интеллектуальных указателей
void GameObjectManager::updateAll(float frametime)
{
checkAlive();
// iterate through the entityManager, updating each entity and then adding it into the quadTree.
for (auto itr = _gameObjects.begin(); itr != _gameObjects.end(); itr++)
{
itr->second->Update(frametime);
tree->AddObject(itr->second);
}
// iterate once again through the entityManager but this time checking itself against the quadTree.
for (auto x = _gameObjects.begin(); x != _gameObjects.end(); x++)
{
std::vector<std::unique_ptr<Entity>> returnObjects = tree->GetObjectsAt(x->second->GetPosition().x, x->second->GetPosition().y);
for (int n = 0; n < (int)returnObjects.size(); n++)
{
std::unique_ptr<Entity>& collided = returnObjects[n];
if(object->getEntityName() != collided->getEntityName())
{
if(object->GetBoundingRect().intersects(collided->GetBoundingRect()))
{
object->Touch(collided);
}
}
}
}
tree->Clear();
}
Что было бы правильным использованием интеллектуальных указателей в этом примере? Когда я добавляю объект в квадровое дерево, я должен создать shared_ptr, передать его как ссылку или использовать std :: move? Я склоняюсь к одному из первых двух, поскольку перемещение владельца указателя приведет к его перемещению со страницы std :: map, и это то, что я не хочу делать.
Существуют ли простые правила, которым я должен следовать при передаче информации? Когда я должен использовать ссылки и когда я должен использовать shared_ptr?