C++中,两个头文件互相引用怎么办

定义了两个头文件
//a.h
#include"b.h"
class a
{

b *b1;
};
//b.h
#include "a.h"
class b
{

a *a1;
};
这样子是编译不了,能不能提供一个实用的解决方案,最好能说说原理。

两个头文件相互包含会导致超前引用的问题,所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数,发生这种情况是无法编译通过的,不过可以采取一些手段解决该问题。

超前引用导致的错误有以下处理办法:

使用类声明,在超前引用一个类之前,首先用一个特殊的语句说明该标识符是一个类名,即将被超前引用。

扩展资料:

头文件:

1、头文件开头处的版权和版本声明;

2、预处理块;

3、nline函数的定义;

4、函数和类结构声明等。

在头文件中,用 ifndef/define/endif结构产生预处理块,用 #include 格式来引用库的头文件。头文件的这种结构,是利用C语言进行开发软件所通常具备的,属于公有知识。

参考资料来源:百度百科-头文件

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-09-19
两个头文件相互包含会导致超前引用的问题,所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数。发生这种情况是无法编译通过的,不过可以采取一些手段解决该问题
超前引用导致的错误有以下几种处理办法:
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) 使用基类指针。
这种方法是在引用超前引用类的地方一律用基类指针。而一般情况下,两个互相引用的类并不涉及其基类,因此不会造成超前引用。
第2个回答  推荐于2017-10-15
不需要这么包含,除非必要

如果你只是想在另外一个类中定义一个类的成员变量,只要在头文件中
加入

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本回答被提问者采纳
第3个回答  2010-01-21
你在最开始加一句#pragma once试试,如果你的编译器支持的话。
不支持就按楼上几位说的做就行了。
第4个回答  2010-01-21
通常是设置个与文件名相对应的"标志",在a.h的所有内容用以下形式围起来:
#ifndef _A_H
#define _A_H 1
<内容>...
#endif

b.h就改成 _B_H

确保已包含过的东西不会重复定义。

C++中,两个头文件互相引用怎么办
超前引用导致的错误有以下处理办法:使用类声明,在超前引用一个类之前,首先用一个特殊的语句说明该标识符是一个类名,即将被超前引用。

解决c++ 循环include
在C++编程过程中,两个文件若互相包含对方的头文件,常会导致编译错误。要解决这个问题,我们可以采用前向声明的方法。以下是一个示例代码,展示了如何通过前向声明来避免循环引用的问题:在头文件中,我们将class File1;和class File2;放在每个头文件之外,并在需要使用该类的时候再进行完整的定义。这种...

C++中两个类如何相互引用?
似乎是不可以的 如果是函数的话, 一个函数A想要调用另一个函数B, 只需要保证A的实现代码前面有B的声明就可以了; 因为常用函数的声明是只含参数代码的(除非A的参数有B的函数指针, B也同样, 这样肯定不能互相调用, 他们之中肯定有一个不知道那个函数指针的类型 ), 互相包含的代码一般在定义(实现)...

C语言与pascal的语法对比
构和操作符重载。这是c++的不及。5. 所有的pascal 必须显式声明构造函数,即使你里面什么也不写。而c++可以没有。6. pascal所有的类都是在堆中申请,统一管理,各个类的互相操作都在堆里面进行。而c++却可以在堆、栈和数据区里面存在,这样各个不同区域的类相互访问,成了c++需要解决的一...

c++里面的 system("pause")是什么意思
在程序中要使用头文件,需要使用 C 预处理指令 #include 来引用它。前面我们已经看过 stdio.h 头文件,它是编译器自带的头文件。引用头文件相当于复制头文件的内容,但是我们不会直接在源文件中复制头文件的内容,因为这么做很容易出错,特别在程序是由多个源文件组成的时候。A simple practice in C ...

C++[Error] conflicting types for 'round'
这种情况往往出现在函数实现文件中,未在头部声明或声明的位置位于函数使用的位置之后;解决办法:将函数声明放到文件靠前位置;二、函数声明的原型中参数或返回类型与函数实现时使用的类型不一致;解决办法:在确定调用与实现一致的情况下,将实现部分的函数头拷贝到声明处,即可解决;三、头文件中的循环引...

在visual C++中怎样删除一个自己建立的类及与其相关的.h文件和.cpp文...
自己建的类,如果是单独保存*.h和*.cpp,先在FileView选中要删除的文件,再按一下del键,然后就可以在目录下直接删除。如果是和别的类保存一个文件中,直接把class 类名{}; 这样的删除,删除后,编译一下,看看其他的地方有没有引用这个类,再一一删除!

category是什么?扩展一个类的方式用继承好还是类目好?为什么
1. 一般来说,导入objective c的头文件时用#import,包含c\/c++头文件时用#include。使用include要注意重复引用的问题:class A,class B都引用了class C,class D若引用class A与class B,就会报重复引用的错误。2. #import 确定一个文件只能被导入一次,这使你在递归包含中不会出现问题。所以,#...

函数原型究竟是什么
4.“...”——用于C++,表示接受任意参数。函数原型作为声明,作用是提示编译器,作为标识符的函数名,在声明之后或外部编译单元\/库文件存在定义,以抑制编译器遇到这个标识符时产生标识符未定义的编译错误。原型作为语法技术的提出,出发点就在于这个作用,利用它可以方便地定义互相递归的函数,以及引用外部...

string的C++ 中
要想使用标准C++中string类,必须要包含#include <string>\/\/ 注意是<string>,不是<string.h>,带.h的是C语言中的头文件using std::string;using std::wstring;或using namespace std;下面你就可以使用string\/wstring了,它们两分别对应着char和wchar_t。用法string和wstring的用法是一样的,以下只用string作介绍:...

相似回答