两个头文件相互包含会导致超前引用的问题,所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数,发生这种情况是无法编译通过的,不过可以采取一些手段解决该问题。
超前引用导致的错误有以下处理办法:
使用类声明,在超前引用一个类之前,首先用一个特殊的语句说明该标识符是一个类名,即将被超前引用。
扩展资料:
头文件:
1、头文件开头处的版权和版本声明;
2、预处理块;
3、nline函数的定义;
4、函数和类结构声明等。
在头文件中,用 ifndef/define/endif结构产生预处理块,用 #include 格式来引用库的头文件。头文件的这种结构,是利用C语言进行开发软件所通常具备的,属于公有知识。
参考资料来源:百度百科-头文件
两个头文件相互包含会导致超前引用的问题,所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数。发生这种情况是无法编译通过的,不过可以采取一些手段解决该问题
超前引用导致的错误有以下几种处理办法:
1) 使用类声明
在超前引用一个类之前,首先用一个特殊的语句说明该标识符是一个类名,即将被超前引用。其使用方法是:
a) 用class ClassB;声明即将超前引用的类名
b) 定义class ClassA
c) 定义class ClassB;
d) 编制两个类的实现代码。
上述方法适用于所有代码在同一个文件中,一般情况下,ClassA和ClassB分别有自己的头文件和cpp文件,这种
方法需要演变成:
a) 分别定义ClassA和ClassB,并在cpp文件中实现之
b) 在两个头文件的开头分别用class ClassB;和class ClassA;声明对方
c) 在两个cpp文件中分别包含另外一个类的头文件
NOTE:这种方法切记不可使用类名来定义变量和函数的变量参数,只可用来定义引用或者指针。
2) 使用全局变量
由于全局变量可以避免超前引用,不用赘述。我的习惯是,把类对象的extern语句加在该类头文件的最后,大家喜欢怎样写那都没有什么大问题,关键是保证不要在头文件中胡乱包含。
3) 使用基类指针。
这种方法是在引用超前引用类的地方一律用基类指针。而一般情况下,两个互相引用的类并不涉及其基类,因此不会造成超前引用。
不需要这么包含,除非必要
如果你只是想在另外一个类中定义一个类的成员变量,只要在头文件中
加入
class 类名;
然后要在.cpp文件中包含这个头文件就可以了
第二种解决方案:
加入宏定义
#ifndef __A_H__
#define __A_H__
class b;
class a {
...
}
#endif
b.h
#ifndef __B_H__
#define __B_H__
class a;
class b {
...
}
#endif
你在最开始加一句#pragma once试试,如果你的编译器支持的话。
不支持就按楼上几位说的做就行了。
通常是设置个与文件名相对应的"标志",在a.h的所有内容用以下形式围起来:
#ifndef _A_H
#define _A_H 1
<内容>...
#endif
b.h就改成 _B_H
确保已包含过的东西不会重复定义。