0

ブースト msm ライブラリ (その仕組みを知る必要はありません) を使用してステートマシンをコーディングしていますが、cpp ソース ファイルの構成について質問があります。

最初のソース ファイル (1.cpp) では、statemachine、イベント、アクション、および遷移テーブルを定義しますが、状態をより頻繁に編集する必要があるという理由だけで、別の cpp ファイルで状態を定義したいと考えています。ステートマシンのその他のもの。

ここで私がしたことは、状態を別のソースファイル (2.cpp) に書き、2.cpp を 1.cpp に含めたことです。

それはすべてをコンパイルしますが、まったくクリーンではありません。これを何らかの形でカプセル化したいと思います..何かアイデアはありますか?

4

3 に答える 3

2

通常、.h ファイル、つまり、型を宣言するヘッダー ファイルと、関連する .cpp ファイルに実装する関数のみを含めます。実装ファイルを含める必要はまったくありません。ヘッダファイルを作成しましたか? 以下に基本的な例を示します。

// Foo.h
class Foo {
    // note that it is not defined here, only declared
    public void some_function(int i);
};

// Foo.cpp
#include "Foo.h"
#include <iostream>

// implement the function here
void Foo::some_func(int i) {
    std::cout << i;
}
于 2012-04-19T02:15:34.293 に答える
2

通常、C++ では、クラスの定義と関数プロトタイプはヘッダー ファイル(.h または .hpp で終わる) に存在し、関数の実装はソース ファイル(.cpp または .cxx で終わる) に存在します。これにより、他のファイルが最初のファイルで使用された定義を使用できるように、外部インターフェイスを公開できます。関数プロトタイプとクラス宣言をヘッダー ファイルに作成し、そのヘッダー ファイルを両方の cpp ファイルに含めます。

一般に、ヘッダー ファイルのみをインクルードし、ソース ファイルを他のファイルにインクルードしないことをお勧めします。

于 2012-04-19T02:17:03.907 に答える
0

これをゼロから作成する場合 (有限状態マシン)、次のように記述します。

fsm.h:

struct fsm_rule {
  /* state to which this rule belongs to */
  int state;
  /* new state */
  int next;
  /* is called when rule matches */
  int (*fn)(int in, void *ctx);
};

struct fsm_state {
  int nrules;
  struct fsm_rule *rules;
};

struct fsm {
  int nstates;
  struct fsm_state *states;
};

そして、内部でfsm.c必要なメソッドを実装します。

PS: Ofcousefsm.cに含まれるものfsm.h

于 2012-04-19T02:15:59.677 に答える