C++中两个类的头文件互相包含问题

转载 2014年08月13日 21:12:54

我们知道,当一个类(设类A)中包含另一个类(设类B)的对象时,必须在该文件中包含另一个类的头文件,如果两个类都互用到了对方的对象,理论上就要互相包含头文件,但是这样是不可取的。贴出代码如下:

//文件A.h中的代码 
02. #pragma once 
03. #include "B.h" 
04. class A 
05. {  
06. public: 
07.         B b;  
08. };  
09.   
10. //文件B.h中的代码 
11. #pragma once 
12. #include "A.h" 
13. class B 
14. {  
15. public: 
16.         A a;  
17. };  

这样是无法通过编译的,其原因是它们的头文件互相包含了,你包含我,我又包含你,没完没了!

为了解决这个问题,只需要去掉一个或则都去掉包含的头文件语句即可,为了要去掉包含的头文件

语句,就不能在类中定义另外一个类的对象,而我们却是要在该类中使用另外一个类的对象,那么

就可以利用对象的指针,而用对象的指针却可以不用包含头文件,做简单的声明即可。这样就打破

了你包含我,我包含你的情况。(当然也可以利用全局对象、类的继承来解决!)


根据情况,可以分为是否使用类的对象:(这里使用类的对象是指将对象当作类的成员)

1、如果在A类中使用了B类的对象,那么就必须包含B类的头文件,而B类中就不能使用A类的对象了,

这时就可以用对象的指针,用对象的指针,可以作简单的声明即可代替头文件的包含。此类情况的

代码如下:

<pre name="code" class="cpp">//文件A.h中的代码 
02. #pragma once 
03. #include "B.h"         //使用了B类的对象,所以要包含头文件
04. 
05.   
06. class A 
07. {  
08. public: 
09.         B b; 	     ///////////////////
10. };  
11.   
12. //文件B.h中的代码 
13. #pragma once 
14.  
15. class A;	//使用了A类对象的指针,只做简单的声明即可
16.   
17. class B 
18. {  
19. public: 
20.         A* a; /////////////
21. };  


最后应该注意,B类中使用的是指针,所以使用前必须先初始化,让其指向一个存在的对象;

另外,为了通过指针使用A类的成员函数,那么就在B类的源文件中加上包含A类的头文件语句。


2、两个类中互相使用了对方的指针,这样的情况很简单,分别在各自的头文件中声明一下使用的类,

而在各自的源文件中包含对方的头文件即可。(也可以根据情况1来解决)


这样就有效解决了头文件互相包含的问题。

参考资料:http://blog.sina.com.cn/s/blog_6e04a8350100sonp.html

http://blog.csdn.net/yang_lang/article/details/6767439


C/C++ 中头文件相互包含引发的问题

C/C++ 中头文件相互包含引发的问题 今天下午遇到一个头文件相互包含而导致的编译问题,花了我不少时间去调试没找到问题,最后晚上跟师兄讨论不少时间,突然有所顿悟! 问题重现 我把问题脱离于项目简...
  • hazir
  • hazir
  • 2014年08月16日 00:39
  • 28809

c++中两个类的头文件互相包含编译出错的解决办法

首先我们需要问一个问题是:为什么两个类不能互相包含头文件?所谓互相包含头文件,我举一个例子:我实现了两个类:图层类CLayer和符号类CSymbol,它们的大致关系是图层里包含有符号,符号里定义一个相...
  • suxinpingtao51
  • suxinpingtao51
  • 2014年07月14日 17:15
  • 3030

C++两个类的头文件相互包含

C++中头文件相互包含的几点问题 一、类嵌套的疑问 C++头文件重复包含实在是一个令人头痛的问题,前一段时间在做一个简单的数据结构演示程序的时候,不只一次的遇到这种问题。假设我们有...
  • Flower195
  • Flower195
  • 2014年05月04日 10:49
  • 1460

C++中头文件相互包含与前置声明

一、类嵌套的疑问 C++头文件重复包含实在是一个令人头痛的问题,前一段时间在做一个简单的数据结构演示程序的时候,不只一次的遇到这种问题。假设我们有两个类A和B,分别定义在各自的有文件A.h和B.h中,...
  • wjs1033
  • wjs1033
  • 2016年04月22日 12:01
  • 356

C++头文件相互引用,最好一个#include,另一个class C;

C++头文件相互#include时最好是: (1)在"CA.h"中 #include "CB.h". (2)在"CB.h"中用类的前向声明: class CA; (3)最好加上头文件卫...
  • tmljs1988
  • tmljs1988
  • 2010年12月16日 22:51
  • 16021

解决头文件相互包含问题的方法

所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数。                 一般情况下,C/C++要求所有的类型必须在使用前被定义,但是在一些特殊情况下,这种要求无法满足,例...
  • changbaolong
  • changbaolong
  • 2011年10月29日 10:48
  • 19795

C++头文件的重定义问题以及头文件互相包含问题

在C++的头文件里,通常通过 #pragma once与#ifndef两种防止头文件二次编译。   有的人将重复编译,重复包含与重复定义弄混,比如:定义一个类,在实例化它之前并不产生内存开销;这与基本...
  • u010177010
  • u010177010
  • 2016年03月10日 16:04
  • 1058

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

在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { int i; B b; } class ...
  • leo115
  • leo115
  • 2012年03月26日 14:58
  • 13844

头文件相互包含的问题解决之

所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数。              一般情况下,C/C++要求所有的类型必须在使用前被定义,但是在一些特殊情况下,这种要求无法满足,例如,在类...
  • wuchalilun
  • wuchalilun
  • 2015年12月29日 18:36
  • 651

C++中两个类互相包含

今天突然想起一个C++的问题,如果一个类A包含类B的实例,而实例B也包含另一个类A,这种方式的代码应该怎么写,按照一般的开发者的想法的代码如下:文件A.h#include "B.h" #include...
  • StephenZou14
  • StephenZou14
  • 2017年01月08日 12:52
  • 395
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中两个类的头文件互相包含问题
举报原因:
原因补充:

(最多只允许输入30个字)