错误:使用前向声明的不完整类型无效



我正试图整理一系列来自Arduino项目处理wifi, mqtt和SPIFF存储配置的意大利面条代码,我发现最简单的解决方案是有一个基类,其中包含指向子类的指针,每个子类都有指向父类的指针,需要时可以调用基类及其指向对象的指针。

在这个SSCCE中,我有两个类A和B,其中B包含在A中,并且在需要时可以访问A的方法。

a.h
#include<stdio.h>
class B;
class A
{
public:
A();
B* b;
void readConf();
};

a.c
#include "a.h"
A::A()
{
}
void A::readConf()
{
//readconf
}

b.h
#include<stdio.h>
class A;
class B
{
private:
A* parent;
public:
B(A*);
void fun();
};

b.c
#include "b.h"
B::B(A* a):
parent(a)
{
};
void B::fun()
{
parent->readConf(); // this call to the parent method raises the error
}

test.c
#include "a.h"
#include "b.h"
int main()
{
A a = A();
return 0;
}

一旦我编译它,虽然我有一个:

gcc -c a.c -o a.o
gcc -c b.c -o b.o b.c: In成员函数' void B::fun() ': b.c:11:8:错误:无效使用不完整类型' class A ' 11 | parent->readConf();^~在文件中包含从b.c:1: b.h:3:7:注:"类A"的前向声明3 | A类;| ^

阅读其他线程我意识到一个前置声明是不够的,因为B类需要知道的完整定义调用它的方法之一,然而包括头文件a.h和b.h创建一个循环依赖,如何使上述工作在不牺牲我设计一个包含指向其他基类可以调用父类及其对象方法通过指向基类的指针?

b.c(应该是。cpp, IMHO)需要知道a的完整定义,以便通过指针解引用它。如果没有这些信息,它就不知道如何找到你期望在那个地址找到的东西。

因此需要#include "a.h"要获得该定义,请从b.cp .

相关内容

最新更新