Xiao_bird博客

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
今天翻译代码,总是生成一个“uses undefined class”错误,搞得我没有头绪。不过,最后还是解决了,现在把解决办法记下来,和大家分享:
问题产生过程:
有两个类,分别在两个头文件中定义:
// ClassA.h
#ifndef _CLASS_A_H_
#define _CLASS_A_H_

#include 
"ClassB.h"

class ClassA
{
    
    ClassB m_ClassB;
    
};

#endif
再看另一个类:
// ClassB.h
#ifndef _CLASS_B_H_
#define _CLASS_B_H_

#include 
"ClassA.h"

class ClassB
{
    
    ClassA
* m_ptrClassA; //注意这里是类ClassA的指针
    
};

#endif
在编译时,在两个头文件中都会报错,分别是ClassA的定义中,找不到ClassB,和ClassB的定义中,找不到ClassA。
这个问题原因我是知道的,因为编译ClassA时,要先包含ClassB的头文件,此时在ClassB的头文件中虽然又包含了ClassA的头文件,但因为防止重复包含的作用,并不生效;但是,在解析ClassB头文件时,却遇到了ClassA的类型,于是报错。这是正常的,于是,我在ClassA的头文件中添加预定义:class ClassB;   并在ClassB头文件中添加预定义:class ClassA;,此时再编译,ClassB.h没有问题了,但是在编译ClassA.h时,却出现错误:
m_ClassB:uses undefined class 'ClassB'

问题的原因及解决办法:
后来经过仔细分析后,终于找到了答案:因为class ClassB;相当于预定义,此时编译器并不知道ClassB的具体定义,也就不知道ClassB的内存分配方式以及占用空间大小,那么,要在类ClassA中定义一个ClassB的对象,编译器就不知道该分配多少空间给它了。不过,如果不是定义一个ClassB的对象,而是定义一个ClassB的指针或是引用,那么这样来应用就没有问题了——这就是其中一个解决办法。
另一个解决办法,如果一定要在ClassA的定义中声明一个ClassB的对象,那么,可以在ClassB的头文件中去掉#include "ClassA.h"这一行,只保留 class ClassA;这个预定义,不过要将#include "ClassA.h"这一行转移到ClassB.cpp文件中去。原因嘛,其实也不复杂,但是说起来却很乱,所以,我决定不再解释了!

posted on 2009-09-14 17:36  Xiao_bird  阅读(3924)  评论(1编辑  收藏  举报