La mia macchina di stato gestisce le richieste e restituisce lo stato successivo. Nella semplificazione qui sotto, ho qui due stati, CreatedState
e RunningState
. Lo stato di esecuzione è lo stato finale e restituisce solo se stesso. Lo stato di esecuzione ha lo stato (come nei memebers) che deve essere presunto, userò il numero intero count
per rappresentarli.
std::unique_pointer<StateBase> handle();
// Caller
void Call(){
_currentState = _currentState->handle();
}
// Created State Implementation
std::unique_pointer<StateBase> CreatedState::handle(){
return std::make_unique<RunningState>();
}
// Running State Implementation (option 1: create a new one)
std::unique_pointer<StateBase> RunningState::handle(){
return std::make_unique<RunningState>(RunningState(int count));
}
Il problema qui è che creare un nuovo RunningState
con un memento / tutti i membri privati del vecchio RunningState
è disordinato e probabilmente inefficiente (?).
In una lingua gestita potrei solo return this
, ma se facessi qualcosa del genere: return std::make_unique<RunningState>(&this)
Avrei due puntatori allo stesso oggetto e la distruzione del lhs _currentState
nella Call()
lascerebbe io con niente a cui puntare.
Come posso lasciare in modo pulito ed efficiente _currentState
invariato?