在C++中,关于CPP的头文件互相包含的问题很让人头疼,其实我们谁也不愿意弄的结构混乱,难以理解,但有时又是有必须的。
假定当前有两个头文件分别为 A.h 和 B.h,内容分别如下:
A.h内容为:
#ifndef _A_H_
#define _A_H_
#endif
#include "B.h"
class A
{
public:
B cl_b;
};
B.h内容为:
#ifndef _B_H_
#define _B_H_
#endif
#include "A.h"
class B
{
public:
A cl_a;
};
编写相应的A.cpp和B.cpp,并编译,发现有错误提示,大意为类型不能找到。为何会出现这种情况?我们知道,C++编译器在编译源文件时采用的是预编译原则,对每一个数据总是需要知道其类型及大小。在A对象中要分配一块属于B的空间,而B中又有A的空间,是一个逻辑错误,因为在未完成预编译的情况下无法预知数据所占用的空间大小。
根据指针的特点,指针在定义后并没有占用实际的内存空间,同时我们使用预先声明的方法,在VC编译环境下做如下修改:
A.h内容为:
#pragma once
#include "B.h"
class B;
class A
{
public:
B *cl_b;
};
B.h内容为:
#pragma once
#include "A.h"
class A;
class B
{
public:
A *cl_a;
};
重新编译,OK,编译通过。我们发现,前置的声明还是很有用的,而此种情况下的宏定义却不能解决我们的问题。
也看了不少的文章建议头文件的包含应该尽量放在.cpp当中,个人认为还是要从实际的情况来看,如果需要嵌套包含的类,其某些方法经常的被调用,就不适合在.cpp中临时创建、销毁类对象,因为这种反复的创建、销毁类对象,对系统资源是非常浪费的。