关于两个类的相互引用时的类型不完全问题, 主要是在下面的情况下会出现:
将两个类的声明与实现全部放在一个文件中. 并且类A定义了类B的指针, 类B定义了类A的指针;
将两个类的声明与实现全部放在一个文件中. 并且类A定义了类B的指针, 类B定义了类A的对象
将两个类的声明与实现全部放在一个文件中. 并且类A定义了类B的对象, 类B定义了类A的指针
将两个类的声明与实现全部放在一个文件中. 并且类A定义了类B的对象, 类B定义了类A的对象
前面三种情况只要分做两个文件(.h 和 .cpp)实现, 并且 类A不在头文件当中 涉及任何 类B的函数或成员变量, 然后将类A的涉及类B的成员的调用全部在CPP文件中实现, 即可编译完成.
最后一种情况无论怎样都是不会编译完成的, 也就是说是坚决不允许的.
编译器编译需数个阶段,先是.h,宏定义的转化替换,C++编译器还要预先提取H文件中的类信息.
由于C++编译实现不够完善,不能将互相用指针调用的两个类在一个文件中完成提取(尽管我觉得编译器完全可以通过再加一次预处理进行前后类信息对照来完成),故而会有这种错误. 目前必须进行分离才能通过编译.
为什么不能完善提取类信息. 需要学编译原理的人来做较为详细的解答. 也有一种可能是因为编译器的作者觉得没有必要这样做,因为要耗费不少工作量, 延长编译速度, 故而要求程序员进行手动分离.不过可能性太小了. 目前没有想到合适的理由来证明C++编译器为什么不支持这种编译.
下面贴出一个类相互引用可以成功的例子, 仅供参考.
//.h文件.
class classb;
class classa
{
public:
classa();
classb *pb;
void exe();
void fun()
{
int a=100;
a+=10;
}
};
class classb
{
public:
classa *pa;
classb( ) {
}
void fun() {
int a=10;
a+=10;
pa->fun();
}
};
//cpp 文件中这样实现:
#include "classa.h"
classa::classa()
{
}
void classa::exe()
{
pb->fun();
}
[ 此帖被rootlife在2010-09-10 18:55重新编辑 ]