たとえば、QStateMachine
を実行する1組のロボットがあります。これらのロボットのすべてのステート・マシンは、同じ基本構造を持っている:QStateMachineのサブクラス化と変更
- 国:
- スリープ
- 検索
- を
- トランジション(
from
戻り - を破壊する - >
to
にonsignal
:- スリープ - >破壊 "次"
- に破壊 - - >検索デストロイ "次"
- 上 - >リターン
- "裏" の検索 "次"
- 検索上>検索 - >リターン "バック" に
- 戻る - >検索 "次"
- に戻る - > "裏" のスリープ
// base.h
#include <QObject>
#include <QState>
#include <QStateMachine>
class Base : public QObject
{
Q_OBJECT
public:
Base(QObject* parent = 0);
~Base();
signals:
void next();
void back();
private:
QStateMachine m_machine;
QState* m_sleep;
QState* m_search;
QState* m_destroy;
QState* m_return;
};
// base.cpp
Base::Base(QObject* parent) : QObject(parent)
{
m_sleep = new QState(&m_machine);
m_search = new QState(&m_machine);
m_destroy = new QState(&m_machine);
m_return = new QState(&m_machine);
m_machine.setInitialState(m_sleep);
m_sleep->addTransition(this, &Base::next, m_search);
m_search->addTransition(this, &Base::next, m_destroy);
m_search->addTransition(this, &Base::back, m_return);
m_destroy->addTransition(this, &Base::next, m_search);
m_destroy->addTransition(this, &Base::back, m_return);
m_return->addTransition(this, &Base::next, m_search);
m_return->addTransition(this, &Base::back, m_sleep);
m_machine.start();
}
今、私は多分、もう少し具体的なあるロボットを持っていると思います。彼が破壊の過程でより詳細で、2つのサブステージを特徴とするとしましょう。 dismantel -> sprayWithAcid -> blowUp -> desintegrate
、彼はそれぞれnext
-signalと一緒に移動するか、または彼はのback
-signalに進みます。
前述のように私の計画では、状態をdestroy
にサブ状態として追加するだけでしたが、信号next
は終了するまでサブマシンを続けるだけでなく、親状態を残します。
どうすればこの問題を回避できますか?か、それと似たような良い方法がありますか?