有可能会碰到两个类之间的相互调用的问题,例如:定义了类A和类B,A中使用了B定义的类型,B中也使用了A定义的类型
class A { B b; }; class B { A a; };
编译器在声明A的时候,由于B的声明在A的下面所以出现编译错误
那么,在定义时如果要相互调用肯定会需要相互包含头文件,如果仅仅只是在各自的头文件中包含对方的头文件,是通不过编译的:
//a.h #include"b.h" class A { public: B xianghuInA; }; //b.h #include"a.h" class B { public: A xianghuInB; };
怎么办?一般的做法是
1)class B采用前置声明的方式声明class A
2)在class B中只能声明class A类型的指针,因为定义指针时不需要对那个类的定义可见
3)在class A的头文件中包含class B 的头文件
//a.h #pragma once #include"b.h" //一定要有 class A { public: B xianghuInA; int a = 1; void funA(); };
//b.h #pragma once #include<iostream> class A; class B { public: int b = 5; A* xianghuInB = NULL; //一定要是指针 void funB(); ~B(); };
//a.cpp #include"a.h" #include<iostream> using namespace std; void A::funA() { cout << xianghuInA.b << endl; }
//b.cpp #include"b.h" #include<iostream> #include <typeinfo> using namespace std; void B::funB() { cout << typeid(xianghuInB).name() << endl; } B::~B() { delete xianghuInB; }
//main.cpp #include<iostream> #include"a.h" #include"b.h" using namespace std; int main() { A qq; qq.funA(); B hh; hh.funB(); return 0; }
运行结果:
或者:
//main.cpp class B; class A { B* b; }; class B { A a; };