gpt4 book ai didi

c++ - 为什么在使用前向声明而不是#include 时得到不完整的类型?

转载 作者:行者123 更新时间:2023-11-30 01:56:31 25 4
gpt4 key购买 nike

我这里有 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

然后是一些状态类,大同小异,我就列一个吧:

测试状态1.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

测试状态.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;
}
}
}

问题:

我正在尝试通过使用前向声明来整理我的代码并使用最少量的 header 包含(尤其是在 header 文件中)。你可以看到在 state_machine 类头中我已经注释掉了 #include "state_t.h" 并将其替换为前向声明 class state_t;。这行得通,我的代码编译并运行了。

然后,在 state.h 中,我将 #include "state_machine.h" 替换为前向声明 class state_machine;(您可以看到我在哪里注释掉了它)。

但现在我收到错误 error: invalid use of incomplete type 'class state_machine' 我在 testState1.cpp 代码中评论过。但我不确定为什么。为什么 state_machine 是不完整的类型?

最佳答案

teststate.cpp需要定义state_machine;所以在那里包含 state_machine.h

“不完整”意味着编译器只看到了声明,class state_machine;,没有看到完整的定义。您可以使用不完整的类型做各种事情,例如声明指针或引用。但是你不能调用成员函数(就像你在这里所做的那样),或者更一般地说,在没有完整定义的情况下做任何需要类成员知识的事情。

关于c++ - 为什么在使用前向声明而不是#include 时得到不完整的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19702909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com