两个类的头文件互相包含
我做任务的时候遇到了两个类都互相包含对方的对象的问题,本来是有错误的,但经过我一番改动,两个头文件互相包含同时,每个头文件都含有令一个类的前置声明。虽然最后运行正确,但是方法不太正确,我写的程序打包放在了码云我的私密仓库里,在网上看到了比较正确的方法记录下来。
问题说明
我们知道,当一个类(设类A)中包含另一个类(设类B)的对象时,必须在该文件中包含另一个类的头文件,如果两个类都互用到了对方的对象,理论上就要互相包含头文件,但是这样是不可取的。贴出代码如下:
2. #pragma once
3. #include "B.h"
4. class A
5. {
6. public:
7. B b;
8. };
9.
10.
11. #pragma once
12. #include "A.h"
13. class B
14. {
15. public:
16. A a;
17. };
这样是无法通过编译的,其原因是它们的头文件互相包含了,你包含我,我又包含你,没完没了!
为了解决这个问题,只需要去掉一个或则都去掉包含的头文件语句即可,为了要去掉包含的头文件
语句,就不能在类中定义另外一个类的对象,而我们却是要在该类中使用另外一个类的对象,那么
就可以利用对象的指针,而用对象的指针却可以不用包含头文件,做简单的声明即可。这样就打破
了你包含我,我包含你的情况。(当然也可以利用全局对象、类的继承来解决!)
根据情况,可以分为是否使用类的对象:(这里使用类的对象是指将对象当作类的成员)
方法一
如果在A类中使用了B类的对象,那么就必须包含B类的头文件,而B类中就不能使用A类的对象了,这时就可以用对象的指针,用对象的指针,可以作简单的声明即可代替头文件的包含。
此类情况的代码如下:
<pre name="code" class="cpp">
02. #pragma once
03. #include "B.h"
04.
05.
06. class A
07. {
08. public:
09. B b;
10. };
11.
12.
13. #pragma once
14.
15. class A;
16.
17. class B
18. {
19. public:
20. A* a;
21. };
最后应该注意,B类中使用的是指针,所以使用前必须先初始化,让其指向一个存在的对象;
另外,为了通过指针使用A类的成员函数,那么就在B类的源文件中加上包含A类的头文件语句。
方法2
两个类中互相使用了对方的指针,这样的情况很简单,分别在各自的头文件中声明一下使用的类,而在各自的源文件中包含对方的头文件即可。(也可以根据情况1来解决)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)