Я новичок в использовании интеллектуальных указателей и до сих пор использовал 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();
}
Мои заботы о том, что использование исходных указателей в качестве аргументов и возврат текущего состояния игры устраняют смысл использования интеллектуальных указателей. Это хороший способ сделать это?
Попробуй это:
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.
pushGameState
семантику перемещения, особенно дляpushGameState
.popGameState
странно. Что означает «if
там? Если вы не хотитеif(!gameStates.empty())
из пустогоvector
проверьте это с помощьюif(!gameStates.empty())
.