
當您使用非階層式綱目實作此狀態圖時,您預期將下列方法新增至類別,並透過來自 rootState_dispatchEvent() 的一系列新函數呼叫來呼叫這些方法:
int MyClass::s2TakeNull() {
int res = eventNotConsumed;
s2_exit();
//#[ transition 2
f2();
f2();
//#]
s3_entDef();
res = eventConsumed;
return res;
};
int MyClass::s1TakeNull() {
int res = eventNotConsumed;
s1_exit();
//#[ transition 1
f1();
f1();
//#]
s2_entDef();
res = eventConsumed;
return res;
};
實際上,所發生的事情是轉移程式碼(//#[ 與 //#] 方括弧之間)會立即列入(內嵌)rootState_dispatchEvent() 的內部,如下所示:
int MyClass::rootState_dispatchEvent(short id) {
int res = eventNotConsumed;
switch(rootState_active) {
case s1:
{
if(id == Null_id)
{
popNullConfig();
//#[ transition 1
f1();
f1();
//#]
pushNullConfig();
rootState_subState = s2;
rootState_active = s2;
res = eventConsumed;
}
break;
};
case s2:
{
if(id == Null_id)
{
popNullConfig();
//#[ transition 2
f2();
f2();
//#]
rootState_subState = s3;
rootState_active = s3;
res = eventConsumed;
}
break;
};
};
return res;
};
此程式碼更有效率,這是因為它會使用列入的程式碼來節省一部分函數呼叫。 使用類別的 CG::Class::ComplexityForInlining 內容可以實現列入,依預設,該內容會設為 3。這表示如果使用者程式碼(轉移的動作部分)少於三行,則會在使用函數呼叫的地方列入程式碼,以取代該函數呼叫。 若要取得「預期」結果(不列入),請將此內容設為 0。