In risposta all'entrata tardiva di Tim alla discussione (che affronta anche uno dei primi commenti di Lev).
Come uno di quelli che hanno sostenuto la separazione dell'uscita dai distruttori nello statechart (argomento basato su un caso d'uso reale, sull'interazione con il mondo reale, ad es. I / O), quando è stato presentato a Boost, sono d'accordo che ci possono essere problemi nel mettere l'uscita logica nei distruttori. David Abrahams ha fatto sorprendentemente argomentazioni convincenti anche sulla sicurezza delle eccezioni. Per questi motivi, Statechart non richiede di inserire la logica nei distruttori, ma consente di farlo con i soliti consigli.
La logica che dovrebbe sempre essere eseguita come parte di una transizione da uno stato (non la distruzione dell'oggetto statechart nel suo insieme) può (e dovrebbe se c'è anche una pulizia delle risorse da fare) essere separata in un'azione exit () separata.
Per uno stato "sottile" senza stato attivo (risorse), solo azioni di entrata / uscita da eseguire, è possibile eseguire quelle azioni in ctor e d'tor e assicurarsi che il costruttore e il distruttore non lancino. Non c'è motivo per loro - non c'è stato su cui eseguire RAII - non c'è male nel far sì che la gestione degli errori in questi luoghi generi eventi appropriati. Potrebbe comunque essere necessario considerare se si desidera che le azioni di uscita che modificano lo stato esterno vengano eseguite alla distruzione della macchina a stati ... e metterle in azione di uscita se non si desidera che si verifichino in questo caso ...
Statechart modella l'attivazione come istanziazione di un oggetto, quindi se il tuo costruttore ha un vero lavoro / attivazione / istanza da fare e se è in grado di fallire in modo tale che lo stato non possa essere inserito Statechart lo supporta dandoti la possibilità di mappare un'eccezione a un evento. Questo viene gestito in un modo che elabora la gerarchia di stato alla ricerca di uno stato esterno che gestisca l'evento di eccezione, analogo al modo in cui lo stack si sarebbe svolto per un modello di chiamata basato sullo stack di chiamate.
Tutto questo è ben documentato - ti suggerisco di leggere i documenti e provarlo. Ti suggerisco di utilizzare i distruttori per ripulire le "risorse software" e uscire dalle azioni per eseguire "azioni di uscita nel mondo reale".
Vale la pena notare che la propagazione delle eccezioni è un po 'un problema in tutti gli ambienti guidati da eventi, non solo negli statechart. È meglio ragionare e includere guasti / errori nella progettazione del proprio statechart e se e solo se non è possibile gestirli in un altro modo ricorrere alla mappatura delle eccezioni. Almeno per me funziona - ymmmv ....