我正在使用boost msm库(你不需要知道它如何工作)来编写我的状态机,我有一个cpp源文件组织问题。
在第一个源文件(1.cpp)中我定义了statemachine,事件和动作以及转换表,但我想在另一个cpp文件中定义状态只是因为我需要编辑很多状态更常见的是状态机中的任何其他东西。
现在我做的是我在另一个源文件(2.cpp)中编写了状态,并在1.cpp中包含2.cpp
它编译和一切,但它根本不干净,我想以某种方式封装它。任何想法?
答案 0 :(得分: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;
}
答案 1 :(得分:2)
通常在C ++中,类和函数原型的定义存在于头文件(以.h或.hpp结尾)中,并且源文件中存在函数的实现(以.cpp或.cxx结尾)。这允许您公开外部接口,以便其他文件可以使用第一个文件中使用的定义。您可以在头文件中创建函数原型和类声明,然后在两个cpp文件中包含该头文件。
通常,最好只包含头文件,而不要在其他文件中包含源文件。
答案 2 :(得分: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:Ofcouse fsm.c
包含fsm.h