используя std :: vector из std :: unique_ptr

0

Я новичок в использовании интеллектуальных указателей и до сих пор использовал unique_ptr. Я создаю игру, и я использую vector unique_ptr для хранения состояния игры.

Вот мой векторный код:

std::vector<std::unique_ptr<GameState>> gameStates;

Вот мой вопрос. Будут ли следующие функции работать, чтобы управлять моим вектором:

void GameStateManager::popGameState(){
    if (getCurrentGameState() != nullptr)
        gameStates.pop_back();
}

void GameStateManager::pushGameState(GameState *gameState){
    gameStates.push_back(std::unique_ptr<GameState>(gameState));
}

GameState *GameStateManager::getCurrentGameState(){
    return gameStates.back().get();
}

Мои заботы о том, что использование исходных указателей в качестве аргументов и возврат текущего состояния игры устраняют смысл использования интеллектуальных указателей. Это хороший способ сделать это?

  • 1
    Необработанные указатели хороши, если они не владеют памятью, но pushGameState семантику перемещения, особенно для pushGameState .
  • 1
    Это popGameState странно. Что означает « if там? Если вы не хотите if(!gameStates.empty()) из пустого vector проверьте это с помощью if(!gameStates.empty()) .
Показать ещё 2 комментария
Теги:
vector
stl
unique-ptr

1 ответ

1
Лучший ответ

Попробуй это:

void GameStateManager::pushGameState(std::unique_ptr<GameState> gameState){
    gameStates.push_back(std::move(gameState));
}

std::unique_ptr не может быть скопирован, но его можно перемещать.

Я думаю, что у него есть некоторые преимущества. Например, посмотрите на этот код.

std::unique_ptr<GameState> pgs;
...
gsm.pushGameState(pgs); // error!
gsm.pushGameState(std::move(pgs)); // you should explicitly move it

Если вы используете необработанные указатели...,

void GameStateManager::pushGameState(GameState *gameState) { ... }

{
    std::unique_ptr<GameState> pgs;
    ...
    gsm.pushGameState(pgs.get()); // IT'S NOT COMPILE ERROR! you can make some mistakes like this..
    gsm.pushGameState(pgs.release()); // you can use it, but I think you will make a mistake sometime, finally.
} // if you use 'pgs.get()', the 'GameState' is deleted here, though 'gameStates' still contains it.
  • 0
    Спасибо за ваше предложение, не могли бы вы объяснить, как это будет работать, поскольку я не совсем понимаю, как использовать двойную ссылку.
  • 2
    Вы можете прочитать Что такое семантика перемещения?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню