C++类相互包含

 

 

1. 两个类需要相互包含的情景

在观察者模式中,气象站的数据送给某些布告牌。

气象站要知道通知哪些布告牌,所以气象站类至少有一个布告牌类型的链表。

布告牌需要把自己注册到气象站类,告诉气象站类自己已经订阅消息,

注册函数需要气象站类作为形参,才知道自己注册到哪一个气象站。

 

也就是说,在类定义的时候,他们就是需要对方的!

所以,我需要在各自类定义的头文件中,include对方类所在的头文件?错误!

具体错误类型是:语法错误(标识符)。

 

 

2.类(和结构体)是不能相互包含的

类在定义的时候需要知道类的大小,实例化的时候才可以正确分配空间。

假如类A正常定义,类B中有类A,这也是OK的,因为类A大小已知,类B大小也就已知了。

 

假如A中有B,B中有A呢?A和B都不确定大小,好像进入了一个类似死锁的情景。

A和B都不知道自己实例化对象的时候到底申请多少空间。

 

同样结构体也是一样,是不可以相互包含的!

 

 

3. 如何解决需要相互包含的情景?

①尽量使用指针来解决问题

既然是因为大小不确定,导致的类定义错误,那就使用类的指针来替代类好了,使用起来没有什么区别!

在Linux内核中,结构体特别多,肯定会出现相互包含的情况吧,所以Linux内核中尽量采用结构体指针。

以后我们也尽量使用结构体指针,通过pStruct->fun()来调用方法。

 

②声明类,而不是包含头文件!

类是在头文件中定义的,类在定义的时候需要包含其他类,所以需要在头文件中包含其他头文件。

思考一下头文件相互include,会出现什么情况?

include就是拷贝的意思,互相include,不就是无限制的拷贝下去吗?

所以头文件的相互包含中也不支持。

有什么解决方法呢?声明类取代include定义:class A;

原来不知道,类也是可以声明的!

 

③如何调用声明类的成员函数?

在定义类B的头文件中,声明了类A,那么类B中如何调用A.fun()?

编译器又不知道A中有哪些成员函数,声明只是告诉有这个类,不提供其他信息。

所以,不要在类的定义头文件中,使用其他类的方法。

在哪里可以使用其他类的方法?在本类的成员函数的实现的cpp文件中可以!

 

 

4.总结的几条重要结论!!!

①在类B的定义头文件中(B.h)不要include其他头文件(A.h)!

②在某个类的定义头文件中(B.h)需要其他类(A.h),使用类的声明(class A;)!

③尽量使用类/结构体指针替

posted @   薛定谔的小冰  阅读(551)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示