Ho un codice a macchina di stato, che ha stato A, B e C, con una funzione changeState (char i) che può cambiare lo stato di un sistema, e ogni stato può anche chiamare changeState (char i) per passare il sistema in un altro stato:
struct State{
State(char aName){
this->name=aName;
}
char name;
};
void changeState(char i);
struct A : public State{
A():State('A'){
changeState('B');
}
};
struct B : public State{
B():State('B'){
changeState('C');
}
};
struct C : public State{
C():State('C'){
}
};
State* state;
void changeState(char i){
switch(i){
case 'A':
state=new A();
break;
case 'B':
state=new B();
break;
case 'C':
state=new C();
break;
}
}
Ora questo codice ha almeno 2 problemi:
-
se non imposto lo stato come globale, devo gestire la gestione della memoria di ogni stato, il che aumenta la complessità del codice
-
se si verifica un cambiamento dello stato ricorsivo, lo stato finale non è quello che mi aspettavo:
Supponiamo di voler attivare la modifica dello stato, iniziare da A a C (per semplificare il codice ora il cambiamento di stato si verifica solo nel costruttore, ma nel codice reale è in un altro metodo che chiama dopo il costruttore):
int main(){
changeState('A');
printf("%c\n",state->name);
return 0;
}
il flusso è: changeState ('A') - > new A () - > changeState ('B') - > new B () - > changeState (C) - > new C () , Voglio che l'ultimo stato sia C, ma ora è A.
La mia domanda è: qual è l'architettura software alternativa o il modello di progettazione se la mia macchina a stati potrebbe cambiare lo stato in modo ricorsivo? o, se possibile, come modificare il codice corrente per superare il problema?