我来我网
https://5come5.cn
 
您尚未 登录  注册 | 菠菜 | 软件站 | 音乐站 | 邮箱1 | 邮箱2 | 风格选择 | 更多 » 
 

本页主题: 问个VC问题,包含了头文件却说类没定义,为什么呢? 显示签名 | 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

ckak147



性别: 帅哥 状态: 该用户目前不在线
等级: 希望之光
发贴: 1716
威望: 0
浮云: 1131
在线等级:
注册时间: 2006-01-19
最后登陆: 2011-10-20

5come5帮你背单词 [ lately /'leitli/ ad. 最近,近来,不久前 ]


问个VC问题,包含了头文件却说类没定义,为什么呢?

两个类A和B,分别定义如下
/*A.h*/
#include"B.h"
class A: public CView
{
  public:
    B b;
  .......
}

/*B.h*/
#include"A.h"
class B: public CDialog
{
  public:
    A a;
  .......
}
其中B.h处报错,说A a处有3个错误,都是“'a' uses undefined class 'A'”,如果改成指针A *a就没有错,就是运行的时候会说a没有初始化.请问这是为什么呢?为什么A.h可以而B.h却报错呢?
顶端 Posted: 2010-02-24 14:55 | [楼 主]
枫姐姐



贝尔诺勋章
性别: 美女 状态: 该用户目前不在线
头衔: 御姐控
等级: 人见人爱
发贴: 3381
威望: 0
浮云: 31792
在线等级:
注册时间: 2009-08-17
最后登陆: 2023-11-19

5come5帮你背单词 [ silk /silk/ n. 丝,绸 ]


LZ,很强大,编译器要被你整死了 
顶端 Posted: 2010-02-24 15:01 | [1 楼]
ckak147



性别: 帅哥 状态: 该用户目前不在线
等级: 希望之光
发贴: 1716
威望: 0
浮云: 1131
在线等级:
注册时间: 2006-01-19
最后登陆: 2011-10-20

5come5帮你背单词 [ loud /laud/ a. & ad. 大声的(地),响亮的(地) ]


Quote:
引用第1楼枫姐姐于2010-02-24 15:01发表的  :
LZ,很强大,编译器要被你整死了 

啊,为什么?
顶端 Posted: 2010-02-24 15:08 | [2 楼]
枫姐姐



贝尔诺勋章
性别: 美女 状态: 该用户目前不在线
头衔: 御姐控
等级: 人见人爱
发贴: 3381
威望: 0
浮云: 31792
在线等级:
注册时间: 2009-08-17
最后登陆: 2023-11-19

5come5帮你背单词 [ slow /sləu/ a. 慢的,缓慢的,迟纯的;v. (使)放慢,(使)减速 ]


A文件中的#include"B.h"宏被展开用B.h来代替,B.h中的#include"A.h"被展开用A.h来代替,然后A.h中又展开B.h,B.h中再展开A.h,这样无休止嵌套下去。。。
顶端 Posted: 2010-02-24 15:08 | [3 楼]
枫姐姐



贝尔诺勋章
性别: 美女 状态: 该用户目前不在线
头衔: 御姐控
等级: 人见人爱
发贴: 3381
威望: 0
浮云: 31792
在线等级:
注册时间: 2009-08-17
最后登陆: 2023-11-19

5come5帮你背单词 [ beast /bi:st/ n. (四足)兽类,牲畜,凶残的人 ]


如果在复杂数据类型定义时出现了嵌套,编译器很可能就无法知道你定义的数据类型的大小。但是指针的大小是固定的,通常和总线宽度一致。在32位CPU中,总线宽度是32位,指针大小也是32位,因此无论是什么类型的指针都是4个字节,编译时就可以确定其大小并为之分配存储空间
顶端 Posted: 2010-02-24 15:13 | [4 楼]
枫姐姐



贝尔诺勋章
性别: 美女 状态: 该用户目前不在线
头衔: 御姐控
等级: 人见人爱
发贴: 3381
威望: 0
浮云: 31792
在线等级:
注册时间: 2009-08-17
最后登陆: 2023-11-19

5come5帮你背单词 [ show /əu/ n. 表演,展示,表面,外观;vt.出示,带领,说明,示范,证明;vi.露面;n.显示 ]


类似情况包括:
typedef struct A
{
  B b;
}A;

typedef struct B
{
  A a;
}B;

这样的定义对于编译器来说是很杯具的,因为在定义A和B类型时出现嵌套,编译器根本无法算出A和B的大小,也就无法为之分配存储空间。

如果改成指针就可以了:
typedef struct A
{
  B* b;
}A;

typedef struct B
{
  A* a;
}B;
因为通常32位CPU中指针是32位,编译器可以明确地知道A和B的大小并为之分配存储空间,在32位CPU中sizeof(A)和sizeof(B)都等于4
顶端 Posted: 2010-02-24 15:19 | [5 楼]
ckak147



性别: 帅哥 状态: 该用户目前不在线
等级: 希望之光
发贴: 1716
威望: 0
浮云: 1131
在线等级:
注册时间: 2006-01-19
最后登陆: 2011-10-20

5come5帮你背单词 [ cite /sait/ vt. 举(例),引证,引用 ]


Quote:
引用第5楼枫姐姐于2010-02-24 15:19发表的  :
类似情况包括:
typedef struct A
{
  B b;
}A;
.......

啊,之前就为嵌套引用的问题搞的头大了,不过还好,现在在类的头文件中加了个壳,就是#ifndef.....#define,就好了~我只是觉得奇怪,为什么编译器会说a引用了没有定义的A类~
如果用指针的话,请问如果实现像定义A  a中a的功能呢?就是如果初始化指针a?我是菜鸟,很多不懂,呵呵
顶端 Posted: 2010-02-24 15:35 | [6 楼]
all阿拉蕾



性别: 帅哥 状态: 该用户目前不在线
等级: 栋梁之材
发贴: 886
威望: 0
浮云: 425
在线等级:
注册时间: 2010-01-09
最后登陆: 2024-10-18

5come5帮你背单词 [ market /'ma:kit/ n. 市场,集市,销路,需求;vt. 销售 ]


Quote:
引用第5楼枫姐姐于2010-02-24 15:19发表的  :
类似情况包括:
typedef struct A
{
  B b;
}A;
.......

枫姐姐好专业啊~~
顶端 Posted: 2010-02-24 18:24 | [7 楼]
曾经沧海





性别: 帅哥 状态: 该用户目前不在线
等级: 初出茅庐
发贴: 6
威望: 0
浮云: 1043
在线等级:
注册时间: 2010-02-23
最后登陆: 2010-03-01

5come5帮你背单词 [ suddenly /'sΛdnli/ ad. 突然地 ]


A* a = new A;

a.a


[ 此帖被曾经沧海在2010-02-24 19:26重新编辑 ]
顶端 Posted: 2010-02-24 19:21 | [8 楼]
air





性别: 保密 状态: 该用户目前不在线
等级: 前途无量
家族: 唯war独尊
发贴: 7889
威望: 0
浮云: 1407
在线等级:
注册时间: 2005-03-14
最后登陆: 2010-12-22

5come5帮你背单词 [ wash /wo/ vt. 洗,洗涤,冲,冲掉;vi. 洗手(脸)洗衣,耐洗;n. 洗涤 ]


A V
顶端 Posted: 2010-02-24 23:51 | [9 楼]
zecker



自信之戒 誓言守护者 执着之戒 勇敢之戒
性别: 帅哥 状态: 该用户目前不在线
头衔: 失落
等级: 版主
家族: 萌菌物语
发贴: 11004
威望: 5
浮云: 342
在线等级:
注册时间: 2005-09-19
最后登陆: 2024-08-21

5come5帮你背单词 [ reaction /ri'ækən/ vi. 反应,化学反应,反作用(力),反动 ]


这。。。。
顶端 Posted: 2010-02-25 01:48 | [10 楼]
我来我网·5come5 Forum » 程序员之家

Total 0.010352(s) query 5, Time now is:11-22 06:11, Gzip enabled
Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号