这里我有state_machine.h:
#ifndef STATE_MACHINE_H
#define STATE_MACHINE_H
// state machine classes
//#include "state_t.h"
class state_t;
class state_machine
{
public:
state_machine();
void change_state(state_t *newState);
void process_state(int data);
private:
state_t *_state;
};
#endif // STATE_MACHINE_H
这是state_t.h:
#ifndef STATE_T_H
#define STATE_T_H
#include <QByteArray>
#include <QDebug>
//#include "state_machine.h"
class state_machine;
class state_t
{
public:
state_t(QByteArray stateName);
virtual ~state_t();
virtual void processState(state_machine *sm, int input) = 0;
void defaultUnknownEventHandler(int event);
QByteArray name;
};
#endif // STATE_T_H
然后一些状态类,或多或少都相同,我只列出一个:
teststate1.h:
#ifndef TESTSTATE1_H
#define TESTSTATE1_H
#include "state_t.h"
class testState1 : public state_t
{
public:
testState1();
void processState(state_machine *sm, int event);
};
#endif // TESTSTATE1_H
teststate.cpp:
#include "teststate1.h"
#include "teststate2.h"
testState1::testState1() :
state_t("state1")
{
}
void testState1::processState(state_machine *sm, int event)
{
qDebug() << name << ": event" << event;
switch (event)
{
case 2:
{
// error: invalid use of incomplete type 'class state_machine'
sm->change_state(new testState2());
break;
}
default:
{
defaultUnknownEventHandler(event);
break;
}
}
}
问题:
我正在尝试整理我的代码,并使用前向声明来使用最少量的标头包含(特别是在头文件中)。您可以在state_machine类标题中看到我已注释掉#include "state_t.h"
并将其替换为前向声明class state_t;
。这很有效,我的代码已编译并运行。
然后,在state.h中,我用前向声明#include "state_machine.h"
替换了class state_machine;
(你可以看到我在哪里评论它)。
但是现在我得到了我在testState1.cpp代码中注释的错误error: invalid use of incomplete type 'class state_machine'
。但我不确定为什么。为什么state_machine是一个不完整的类型?
答案 0 :(得分:4)
teststate.cpp
需要state_machine
的定义;所以请在那里加state_machine.h
。
“Incomplete”表示编译器只看到了声明class state_machine;
,而不是完整定义。您可以使用不完整的类型执行各种操作,例如声明指针或引用。但是你不能调用成员函数(就像你在这里一样),或者更普遍地做任何需要知道类成员的事情,而没有完整的定义。