私は古いステート マシン フレームワークを C から C++11 に移植することで C++11 について学ぼうとしている古い C の男です。私の考えは、状態マシン自体のクラスを作成し、その中の状態のネストされたクラスを作成することです。状態は階層的、つまり上位状態と下位状態の場合があります。フレームワークは状態のスーパーステートについて知る必要があり、そのためにstate *superstate
ネストされた状態クラスにポインター () があります。
私の問題は、コンストラクターをマシンのクラス内で直接使用してスーパーステート ポインターを設定することを意図していたことです。これは、均一な初期化を使用して、非静的データ メンバーの初期化を使用する C++11 で可能になるはずです。substateB3{superstateA}
しかし、別のタイプの状態/クラスに設定すると、何らかの理由でコンパイルに失敗します ( )。set_superstate
しかし、コンストラクターと同じ引数を持つ特定の関数 ( ) をこの目的のために使用して後で設定すると、正常に動作します! スーパーステートを同じタイプの状態/クラス ( ) に設定すると、コンストラクターが受け入れられsubstateB2{substateB1}
ます。
私はgcc 4.7.0を使用しています(非静的データメンバー初期化子のサポートを取得するため)。これが私のコードです:
// My state-machine framework (simplified)
struct machine {
struct state {
state() : superstate(nullptr) { } // No superstate => toplevel state!
state(state &superstate) : superstate(&superstate) { }
state *superstate;
void set_superstate(state &superstate) { this->superstate = &superstate; } // Non-ctor way to set superstate
};
};
// An example of a specific state-machine using my framework
struct Machine : machine {
struct SuperstateA : state {
} superstateA;
struct SubstateB : state {
} substateB1, // Compiles OK; gets its superstate set in Machine's ctor below
substateB2{substateB1}, // Compiles OK; but not correct superstate
substateB3{superstateA}; // gcc 4.7.0 error: could not convert ‘{((Machine*)this)->Machine::superstateA}’ from ‘<brace-enclosed initializer list>’ to ‘Machine::SubstateB’
Machine() { substateB1.set_superstate(superstateA); } // Compiles OK;
} myMachine;
ヒントやガイダンスは大歓迎です。:)