まず、1 つのヘッダー ファイルにステート マシンを実装することに成功しました。いくつかの前方宣言が必要であることはわかっており、外側から内側への状態を定義する必要があります。私が本当に理解していないのは、複数のファイルでこれを行うにはどうすればよいですか?
私のアプローチ:
- 状態ごとに 1 つのヘッダー
- 可能なすべての状態を含む 1 つのヘッダー、前方宣言
- 状態を宣言する各ヘッダーには、そのコンテキストを宣言するヘッダーが含まれます
次に、次のようになります。
// forward.h
struct Machine;
struct StA;
struct StB;
// machine.h
#include "forward.h"
struct Machine : sc::state_machine< Machine, StA > {};
// a.h
#include "forward.h" // for StB
#include "machine.h"
struct StA : sc::simple_state< StA, Machine, StB > {};
// b.h
#include "forward.h"
#include "a.h"
struct StB : sc::simple_state< StB, StA > {};
現在、すべてをプログラムに含める方法は未解決のままです。私のアイデアは、すべての州のヘッダーの外側から内側までを含む 1 つのヘッダーを持つことでした。
// the_machine.h
#include "forward.h"
#include "machine.h"
#include "a.h"
#include "b.h"
// use this header now where you need the state machine
ただし、一般的なアイデアが正しいかどうかはわかりません。たとえそうであったとしても、これをコンパイルすることはできません (正確にはこれではなく、この設計原則に従って構築したマシンです)。コンテキストを完全にする必要があること、状態を事前に宣言する必要があることなどに気付いたら、すべてを1つのファイルにまとめるのは非常に簡単ですが、複雑さとメンテナンスの理由で分割すると神経がすり減ります...Incomplete type 'StXY' used in nested name specifier
など。