C++类相互包含

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

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

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

布告牌须要把本身注册到气象站类,告诉气象站类本身已经订阅消息,url

注册函数须要气象站类做为形参,才知道本身注册到哪个气象站。指针

 

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

因此,我须要在各自类定义的头文件中,include对方类所在的头文件?错误!对象

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

 

 

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

类在定义的时候须要知道类的大小,实例化的时候才能够正确分配空间。编译器

假如类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;)!

③尽可能使用类/结构体指针替代对象!

④在某个类的定义头文件中(B.h),不该该调用其余类的方法(A.fun())!

⑤由于要在类B的成员函数的实现c文件中(B.cpp),才会开始调用A的成员函数(A.fun()),

这个时候在B.cpp中包含include “A.h”就不会出问题了!

 

参考:

c语言结构体相互引用

C++中两个类相互包含引用问题

相关文章
相关标签/搜索