1

私は、各状態が状態の基本クラスから派生した個別のクラスである独自の状態マシンを作成しようとしています。

state_t クラス ファイル (#include "state_t.h") をインクルードする場合は常に、すべての派生状態クラス ヘッダーもインクルードする必要があるため、ステート マシンを使用する必要があるたびにすべてを個別にインクルードする必要はありません。新しい状態を作成します。

「state_t」は state_t.h の最後まで定義されないため、状態ファイルはファイル state_th.h の最後にのみ含めることができます。これまでにこれを行うコードを書いたことがなく、少し奇妙に思えます! すべてのファイルをまとめてトップレベルの「statemachine.h」を追加することもできますが、無駄に思えます。

私の質問は次のとおりです。これを行うのは正しいですか/安全ですか/大丈夫ですか? 欠点/問題はありますか?

注:現時点では、私のコードはすべてテスト コードであり、Qt で記述されていますが、それはストレートな C++ の質問である必要があります。

ここに私の基本クラス (state_t.h) があります - #includeが最後にあることに注意してください:

#ifndef STATE_T_H
#define STATE_T_H

#include <QByteArray>
#include <QDebug>

class state_t
{
public:
    state_t(QByteArray stateName);
    virtual ~state_t();
    virtual state_t * processState(int input) = 0;
    QByteArray getState();

    QByteArray name;
};

#include "teststate1.h"
#include "teststate2.h"

#endif // STATE_T_H

状態派生クラス (teststate1.h) は次のとおりです。

#ifndef TESTSTATE1_H
#define TESTSTATE1_H

#include "state_t.h"

class testState1 : public state_t
{
public:
    testState1();
    state_t *processState(int input);
};

#endif // TESTSTATE1_H

ここに私のmain.cppがあります:

#include <QCoreApplication>
#include <QDebug>
#include "state_t.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    state_t *myState = new testState1();

    myState = myState->processState(1);
    myState = myState->processState(2);
    myState = myState->processState(3);
    myState = myState->processState(1);

    return a.exec();
}

注:コードはすべて完全に機能しますが、実際には「正確さ」の問題です。

4

4 に答える 4

1

インクルードを一番上に置くことを好みます。そうしないと、少し混乱する可能性があります。私の提案は、teststate1.h と teststate2.h を test_t.h に含めずに、state_all.h を作成することです。

#include "state_t.h"
#include "teststate1.h"
#include "teststate2.h"

そして、必要な場所に state_t.h の代わりに state_all.h を含めます

于 2013-10-22T11:25:09.923 に答える