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

问题描述

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

在这个 SSCCE 中,我有 2 个类 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:在成员函数中 ‘void B::fun()’: b.c:11:8: 错误:不完整类型的无效使用 'A 类' 11 |父级->readConf(); | ^~ 在 b.c:1 包含的文件中:b.h:3:7:注意:“A 类”的前向声明 3 | A级; | ^

阅读其他线程我意识到 A 的前向声明是不够的,因为类 B 需要知道 A 的完整定义才能调用方法之一,但是在 ah 和 bh 中包含头文件会创建循环依赖,如何在不牺牲我的基类设计的情况下进行上述工作,该基类包含指向其他类的指针,这些类可以通过指向基类的指针调用父类及其对象方法

解决方法

b.c(应该是 .cpp,恕我直言)需要知道 a 的完整定义才能通过指针取消引用它。没有这些信息,它不知道如何找到您希望在该地址找到的任何内容。

因此,您需要 #include "a.h" 以从 b.cpp 内部获取该定义。