超前引用问题---error C2079: '' uses undefined class

转载 2012年03月29日 13:52:04
今天遇到了这样的错误: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重载)

以前我对老师总是留一份怀疑的态度,而现在感觉要保持严重怀疑的态度。。。

这个戳瓢事浪费了我半个小时,自然也就不吝啬多花这半个小时来记之。

Xcode:Undefined symbols for architecture i386:和"_OBJC_CLASS_$_xx", referenced from: error

Undefined symbols for architecture i386: "_OBJC_CLASS_$_xx文件名", referenced from: ...

iOS:编译错误Undefined symbols for architecture i386: _OBJC_CLASS_$_XXX", referenced from: error

Undefined symbols for architecture i386: _OBJC_CLASS_$_XXX", referenced from: error 这个意思为无法找到名为XX...

解决头文件相互包含问题的方法----超前引用

所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数。     一般情况下,C/C++要求所有的类型必须在使用前被定义,但是在一些特殊情况下,这种要求无法满足, 例如,在类CMyView中...

vuejs路由使用的问题Error in render function: "TypeError: Cannot read property 'matched' of undefined"

从一次执行错误开始html代码 首页 关于我们 当然了这个HTML代码时没有问题的,大家也可以再vue-router的文档上看到相...

linux重新编译安装gd,增加freetype支持,解决验证码不显示问题,Fatal error: Call to undefined function imagettftext()

问题: Fatal error: Call to undefined function Think\imagettftext() in /var/www/webreg/ThinkPHP/Librar...
  • hxl5u
  • hxl5u
  • 2015年08月14日 01:11
  • 2549

Undefined symbols for architecture i386:和"_OBJC_CLASS_$_xx", referenced from:问题解决方法

多个人共同操作同一个项目或拷贝项目时,经常会出现类似这样的问题: Undefined symbols for architecture i386: "_OBJC_CLASS_$_xx文件名...

Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class lzl.edu.c

在自定义view中常常会出现这么一个错误 Caused by: android.view.InflateException: Binary XML file line #12: Error i...

没有躲过的坑--头文件相互包含(Compiler error C2653: not a class or namespace name)

最近被自己坑儿了一把,改别人的代码,最后编译器这样报错的:error C2653: not a class or namespace name简单描述一下: 有一个类A,声明和实现分别位于 a.h和...

error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'

1>e:/program files/microsoft visual studio 9.0/vc/atlmfc/include/afxtempl.h(776) : error C2248: 'COb...

error C2248: 'CObject::operator =' : cannot access private member declared in class

 用sort进行排序的时候遇到了这个错误,上网一搜,发现了原因所在。又学到东西了,真是庆幸至极。  1>e:/program files/microsoft visual studio 9.0/vc/...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:超前引用问题---error C2079: '' uses undefined class
举报原因:
原因补充:

(最多只允许输入30个字)