C++中头文件互相包含问题

本文通过实例演示了C++中头文件相互包含导致的编译错误,并提出了使用前置声明来解决这类问题的方法。同时分享了两个实用原则:减少头文件包含以及将头文件包含从.H转移到.CPP文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

信心满满地做了一个程序,十分顺手,半个小时搞定,F5编译,竟然报错

1>d:\vc2005\meetingroom\meetingroom\RoomManager.h(20) : error C2143: 语法错误 : 缺少“;”(在“*”的前面)
1>d:\vc2005\meetingroom\meetingroom\RoomManager.h(20) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>d:\vc2005\meetingroom\meetingroom\RoomManager.h(20) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

愕然!竟然错了,找错吧,费了好大的劲才知道自己什么地方错了,代码长了点就不粘了,不过用一个简单的例子演示:

//Test1.h
#ifndef _TEST1_H_
#define _TEST1_H_
#include "Test2.h"
class A{
B *b;
};
#endif


//Test2.h
#ifndef _TEST2_H_
#define _TEST2_H_
#include "Test1.h"
class B{
A *a;
};
#endif

问题出现了,我们不妨分析Test1.h这个文件,头文件保护符后包含Test2.h文件,进入Test2.h文件中,在经历头文件保护符后进入Test1.h文件,因为_TEST1_H_已经定义,以下代码无效类A就成了没有定义的类型了。

解决办法:

分别使用前置声明。

//Test1.h
#ifndef _TEST1_H_
#define _TEST1_H_
class B;
class A{
B *b;
};
#endif


//Test2.h
#ifndef _TEST2_H_
#define _TESTE2_H_
class A;
class B{
A *a;
};
#endif


编译成功!

下面的两个原则不错分享一下:
    第一个原则应该是,如果可以不包含头文件,那就不要包含了。这时候前置声明可以解决问题。如果使用的仅仅是一个类的指针,没有使用这个类的具体对象(非指针),也没有访问到类的具体成员,那么前置声明就可以了。因为指针这一数据类型的大小是特定的,编译器可以获知。
    第二个原则应该是,尽量在CPP文件中包含头文件,而非在头文件中。假设类A的一个成员是是一个指向类B的指针,在类A的头文件中使用了类B的前置声明并编译成功,那么在A的实现中我们需要访问B的具体成员,因此需要包含头文件,那么我们应该在类A的实现部分(CPP文件)包含类B的头文件而非声明部分(H文件)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值