现在假设需要定义两个类A,B。并分别将他们的定义和实现放在不同的文件中。设A的定义文件为a.h,实现文件为a.cpp。B的定义文件为b.h,实现文件为b.cpp。
如下定义是非法的。
#ifndefA_H
#defineA_H
#include"b.h"
classA
{
private:
B b;
};
#endif
//b.h
#ifndefB_H
#define B_H
#include"a.h"
classB
{
private:
A a;
};
#endif
错误的关键就在于,我们在类A中定义了B的对象,又在B类中定义了A的对象,这样就会陷入循环定义的死循环中导致链接时报错。但是如果我们相互定义对方类型的指针,这样是完全可行的。
//a.h
#ifndef A_H
#define A_H
#include "b.h"
class A
{
private:
B *b; //合法
};
#endif
//b.h
#ifndef B_H
#define B_H
#include "a.h"
class A; //对类A进行额外的声明
class B
{
private:
A *a; //合法
};
#endif
有时候我们会遇到这样的奇怪现象,即使我们在b.h文件中包含了a.h,即#include “a.h”,编译器仍然无法识别类A。这时候就需要我们在调用A之前,额外地对A进行声明,使用class关键字。
今天终于可以发博客了,顺便庆祝一下,哈哈。