类的继承在面向对象的c++程序设计语言里是如此普遍,而且我们为了文档结构到最后不至于混乱,总会是一个h文件写类的声明,另一个cpp文件写类的定义,这样在测试该类的时候只需#include这个h文件即可,可有一个问题会悄然发生,当某个cpp文件需要父类又需要子类的h文件时,即#include“A.h”#include”B.h”B是A的子类,就会发生一个问题,重复编译A.h,这时就要用到选择性编译指令了。
需要用到的预编译指令有#define, #ifdef, #ifndef, #endif。
很好理解,define:宏定义,ifdef:如果定义,ifndef:如果没有定义,endif:结束if指令。
下面来看看一个例子。
A.h文件如下:
class A
{
public:
A(){}
};
B.h文件如下:
#include"A.h"
class B: public A
{
public:
B():A(){}
};
若在某个文件中包含如下语句:
#include"A.h"
#include"B.h"
在这先不问直接加载一个”B.h”不就可以了么,而是为了防止这样的语句出现在长长的cpp文件而出现的编译错误该怎样来有效解决。
以下是一个解决方案,修改后的文件结构如下。
A.h文件如下
#define AK
class A
{
public:
A(){}
};
B.h文件如下
#ifndef AK
#include"A.h"
#endif
class B: public A
{
public:
B():A(){}
};
可以看见,只需在A.h文件定义一个标志宏名,然后在B.h文件中判断该标志宏名有没有被定义,没有则加载,有则不再重复加载。
以上只是一个简单的继承关系,事实上,当每个继承关系发生时,都该采取类似的选择性编译来保证被加载的无错性。完。