超前引用问题---error C2079: '' uses undefined class
来源:互联网 发布:typescript 调用js 编辑:程序博客网 时间:2024/06/01 08:09
转载自 : http://aigo.iteye.com/blog/1922330
今天遇到了这样的错误: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重载)
以前我对老师总是留一份怀疑的态度,而现在感觉要保持严重怀疑的态度。。。
这个戳瓢事浪费了我半个小时,自然也就不吝啬多花这半个小时来记之。
0 0
- 超前引用问题---error C2079: '' uses undefined class
- 超前引用问题---error C2079: '' uses undefined class
- 超前引用问题---error C2079: '' uses undefined class
- 超前引用问题---error C2079: '' uses undefined class
- 关于error C2079: 'a' uses undefined class 'A' . 超前引用
- VC中超前引用有关问题-error C2079: '' uses undefined class
- 超前引用(类的提前声明)出错:error C2079: 'xxx' uses undefined class '***'
- error C2079: 'a' uses undefined class 'A' .
- 关于error C2079: 'a' uses undefined class 'A'
- error C2079: * uses undefined class 'CArray<TYPE,ARG_TYPE>'
- error C2079: 'lstr' uses undefined class 'std::basic_stringstream<_Elem,_Traits,_Alloc>'
- WinPcap编程错误:error C2079: 'IPAddress' uses undefined struct 'sockaddr_storage的解决办法
- error C2079: CButtonST::m_ToolTip 使用未定义的 class CToolTipCtrl
- 超前引用
- 超前引用
- 超前引用
- 超前引用
- 超前引用
- 杭电1024Max Sum Plus Plus
- Codeforces Round #364 (Div. 2) E DFS
- Android6.0的phone应用源码分析(8)——来电(MT)
- 实习的第一天:配置环境
- css3技巧之背景渐变
- 超前引用问题---error C2079: '' uses undefined class
- AndroidStudio快捷键
- J2ee项目从0搭建(九):将eclipse创建的web项目迁移到Intellij IDEA中运行
- Android6.0的phone应用源码分析(9)——UICC卡管理
- Swift基础(十四)UITextField
- VC/C++中分割字符串函数AfxExtractSubString的应用
- php+微信开发实现微信图书馆图书查询
- JAVA:自定义标签
- asp.net mvc表单提交