现在有两个类要相互应用时,会出现各种各样的问题,首先看第一个例子:
#ifndef AH
#define AH
class B;
class A {
B *memb;
A() {
}
~A() {
delete memb;
}
};
#endif
头文件A.h包含class A如上:
#ifndef BH
#define BH
class B {
};
#endif
头文件B.h包含classB
此时编译就会产生类似上面的警告信息:warning C4150: 删除指向不完整“B”类型的指针;没有调用析构函数
此时因为在class A 中的B 的声明是依赖B的前置声明,而不是#include"b.h"所以,B对A来说是不可见的,因此无法调用析构函数。
如果这时class A 和class B相互应用对象:如下代码:
A.h
#ifndef AH #define AH class B; class A { B b; }; #endif
B.hB 对于A来说还是不可见的,所以定义会报错;即使在A.h中包含#include"b.h"这时会出现相互包含的问题,相互的定义都无效。#ifndef BH #define BH #include "A.h" class B { A a; }; #endif
此种状况的解决利用前置声明定义的那个类中的保持另外一个类的引用定义为指针,定义指针时不需要对那个类的定义可见