本文共 766 字,大约阅读时间需要 2 分钟。
昨天跟朋友讨论了一下在C++中如果出现两个类相互引用的情况,编译无法通过的问题如何解决:
// A.h#ifndef A_H#define A_H#include "B.h"class A{ B b;};#endif A_H
// B.h#ifndef B_H#define B_H#include "B.h"class B{ A a;};#endif // B_H
以上代码是肯定无法编译通过的,编译器会告知如下错误:
error C2146: 语法错误 : 缺少“;”(在标识符“a”的前面)[问题分析]
这种引用方式是在一个类中包含了另一个类的实例,如:A类中包含了B类的实例,B类中又包含了A类的实例……如果允许这种情况出现,那么在实际生成对象时,将出现递归包含,最后耗尽资源。因此,无法通过编译是再正常不过了。
类似可行的情形是,一个类包含另一个类的实例,另一个类包含指向前一个类的指针。由于指针的使用,在实例化时将不会出现递归生成对象的问题。在头文件包含方面,可以选择一个类的头文件包含另一个类的头文件,而另一个类的头文件中只声明需要引用的类,并在类中声明指针变量:
// A.h#ifndef A_H#define A_H#include "B.h"class A{ B b;};#endif A_H
// B.h#ifndef B_H#define B_Hclass A;class B{ A* a;};#endif // B_H
在main函数中只需要包含要使用的类头文件即可:
#include "A.h"int main(){ A a; return 0; }或者#include "B.h"int main(){ B b; return 0; }
转载地址:http://dvtsi.baihongyu.com/