正文

C++一个经典的超前问题2011-10-24 15:42:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/miaowei/52886.html

分享到:

今天遇到了这样的错误:error C2079: 'xxx' uses undefined class 'yyy' 不得不承认自己有土鳖的基因。本来是很普通的一件事情。 自己居然不知道。 刚好碰到网上一个达人的分析文章,觉得非常经典的分析了这个经典的问题。固转载如下:   比如说,我们先定义一个b类再定义一个a类,a的一个成员就是b,如下: class b{ int i; }; class a { b val ; }; 这显然是可以的。 如果这个时候,要把b的定义放到后面去,大家都知道在前面先声明b,那么: class b; class a { b val ; }; class b{ int i; }; 这段对不对呢?如果不编译,直观感觉,我以前总以为是可以的。。 但其实是通过不了编译的。那么再改,把val换成对b的指针,这样: class b; class a { b * val ; }; class b{ int i; }; 然后就可以了。 那么,直接给出一条重要的结论: 超前引用不可使用类名来定义变量和函数的变量参数,只可用来定义引用或者指针。 要解释其实是很简单的,因为编译器在处理类的时候,要为他的成员分配空间。 如果我们用指针,那么直接分配4个字节就可以了,就像: class b; class a; class a { b *val ; }; class b{ a *val ; }; 但是,如果成员变量是类呢?? class b; class a; class a { b val ; }; class b{ a val ; }; 这种情况下,就好比把两面镜子对着放置一样。。 当处理到a的val的时候,发现是个b,那么给b留出空间, 为了知道给b留出多少空间,再看b,发现b的val是a, 那么又需要再知道该给a多少空间。。。 这个道理其实是很显然的。 所以,VC编译的时候说'xxx' uses undefined class 'yyy' 。 也许你觉得这些是很显然的事情,自己写的时候不会犯这种傻。 那么要小心的就是STL了。比如说你list <myClass>。 而这个时候myClass是处于已定义状态,则没有问题。 如果这个时候myClass是处于声明状态,则会有很大的问题。 而VC6对STL报错的囧况,想必用过的人都知道。 往往都是一大堆,要从中提取有用的信息很不容易。 唉。。也许是我入门看的资料太瓜了。。虽然超前声明这个概念到处都提, 却没怎么见有人专门指出这点。。看来有时间还是要从头学学国外名著了。。。 今天发现这个问题,也是因为我们助教给的一堆接口及实现。 我现在真的是严重怀疑他究竟有没有编译通过。。。改了我半天。。 就算他通过了,也是俨然一不标准的用法。明显是留有逻辑黑洞的隐患的。 众所周知,VS可以编译好些VC不能编译的东西。。 原因是放宽了对标准的审核 又众所周知,DEV可以编译好些VC不能编译的东西。。 原因是VC对C++的有些标准实现上有问题 (比如using namespace std下的cout重载)

阅读(2969) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册