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

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

ckak147



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

5come5帮你背单词 [ beloved /bi'lΛvd/ a. 被钟爱的 ]


问个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帮你背单词 [ goddess /'godis/ n. 女神 ]


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



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

5come5帮你背单词 [ political /pə'litikəl/ a. 政治的 ]


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帮你背单词 [ fixer // n. 固定器,定影剂,维修工 ]


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帮你背单词 [ visual /'vizjuəl/ a. 看得见的,视觉的 ]


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



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

5come5帮你背单词 [ accept /ək'sept/ vt. 接受,领受,认可;vi. 同意,认可 ]


类似情况包括:
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帮你背单词 [ rhetoric /'retərik/ n. 修辞(学) ]


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阿拉蕾



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

5come5帮你背单词 [ clause /klo:z/ n. 条款,款项,分句,从句 ]


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帮你背单词 [ sympathetic /simpə'θetik/ a. 同情的,体谅的,赞同的,支持的 ]


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帮你背单词 [ conductor /kən'dΛktə/ n. 售票员,列车员,指导员,(乐队的)指挥,导体,导线 ]


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



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

5come5帮你背单词 [ balloon /bə'lu:n/ n. 气球 ]


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

Total 0.013324(s) query 5, Time now is:03-29 02:37, Gzip enabled
Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号