Solve Error: 'has incomplete type', foward declaration of 'class x'

本文详细解释了在C++的OO编程中遇到的has incomplete type错误,并通过实例展示了如何正确声明和使用类之间的依赖关系。包括将对象实例改为对象指针和引入头文件两种解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

在C++的OOB编程中,有时候我们会遇到这样的错误Error: 'has incomplete type',forward declaration of 'class x',那么是什么原因引起的这个问题呢,我们首先来看下面这段代码:

 

// Error: field '_a' has incomplete type 'A'
// forward declaration of 'class A'
class A;

class B {
public:
    B(A a): _a(a) {}
private:
    A _a;
};

class A {
public:
    A(B b): _b(b) {}
private:
    B _b;
};

 

在上面这段代码中,类A和类B互相含有对方作为自己的私有成员变量,那么不管谁写在前面,如果不事先声明另一个的话,都会报错找不到定义,那么我们事先声明A就没事了吗,也不是,像上面那样B中声明A的对象还是会出错,因为编译器不知道A的定义,无法生成类A的实例,所以会报错。一种改正方法是把对象实例变成对象指针,如下所示:

 

// Correct
class A;

class B {
public:
    B(A *a): _a(a) {}
private:
    A *_a;
};

class A {
public:
    A(B *b): _b(b) {}
private:
    B *_b;
};

 

还有一种解决方法是引入头文件,这样编译器就知道提前知道类A和类B的结构了,虽然不知道具体的实现,但是互相建对象实例是木有问题的~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值