0

我正在使用 boost msm 库(您不需要知道它是如何工作的)来编码我的状态机,并且我有一个 cpp 源文件组织问题。

在第一个源文件(1.cpp)中,我定义了状态机、事件和动作以及转换表,但我想在另一个 cpp 文件中定义状态,只是因为我需要更频繁地编辑状态状态机中的任何其他内容。

现在我所做的是我在另一个源文件(2.cpp)中写了状态,我在 1.cpp 中包含了 2.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 回答