重複の可能性:
C++: これを削除しますか?
ゲームの状態を管理するシステムを作成しようとしています。
現在の設計の問題は、状態を切り替えると、制御が新しい状態に切り替わる前に古い状態が削除されることです。
以下は、私のコードの簡略版です。
class StateManager;
class State
{
public:
virtual void update(StateManager &manager)= 0;
virtual ~State(){}
};
class StateManager
{
public:
void setState(std::unique_ptr<State> && newState )
{
currentState = std::move(newState);
}
std::unique_ptr<State> currentState;
void run()
{
currentState->update(*this);
}
};
State オブジェクトが update メソッド内で StateManager::setState を呼び出すと、破棄されたばかりのオブジェクトでメンバー関数が呼び出される期間が発生することに注意してください。
この動作の完全な例はhttp://ideone.com/WHLzJLにあります。FirstState::update が返される前に、FirstState のデストラクタがどのように呼び出されるかに注意してください。
これは C++ で未定義の動作ですか? その場合、どのようにデザインを変更すればよいですか?