c++ 的类的提前声明已经 两个对象互相包含对方指针的类型的创建

在开发项目过程中,为了方便调用,经常会碰到两个对象相互拥有对方的调用的过程。

大家都知道c++生成可执行代码的过程包括,预处理,编译,优化,汇编,链接。

接下来纪录一下这样的类的声明

#ifndef A

#define A

#include "B.h"

class A {

B* b;

};

#endif


#ifndef B

#define B

#include "A.h"

class B {

A* a;

}

#endif


#include "A.h"

#include "B.h"

int main() {
A* a;

B* b;

}

编译器加在A.h文件,A.h文件被预编译为

#ifndef A

#define A

#ifndef B

#define B

#include "A.h" //此时宏A已经定义 头文件A.h不会再次被加在 此指令不会执行

class B {

A* a;

}

#endif

class A {

B* b;

};

#endif


这样我们就能看到 定义类B的时候,A的类型还没有加载,编译器不知道,所以你得告诉编译器A的类型,需要类型的提前编译


#ifndef A

#define A

#ifndef B

#define B

#include "A.h" //此时宏A已经定义 头文件A.h不会再次被加在 此指令不会执行

class A; //类型A的提前声明,意思是告诉编译器,你不用管了,这个类型存在,不会影响接下来的链接的。

class B {

A* a;

}

#endif

class A {

B* b;

};

#endif

更新后A.h为

#ifndef A

#define A

class B;

class A {

B* b;

};

#endif


更新后B.h为

#ifndef B

#define B

class A;

class B {

A* a;

}

#endif


由于类A,类B是相互独立的,不能因为先加载一个,后加载一个 而省略掉一个类的声明。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值