summer's C++ house
C++博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
1 随笔 :: 0 文章 :: 0 评论 :: 0 Trackbacks
<
2026年6月
>
日
一
二
三
四
五
六
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
随笔档案
2011年3月 (1)
搜索
最新评论
2011年3月13日
#
c++ 的前向声明与全局变量
最近在写2个类的时候碰到了,有点搞迷糊了,顺便记录下
实际上是有2个QWidget的子类,简单点就类A 跟类B好了
A的头文件如下 A. h
class
A
{
void
f();
void
f2();
private
:
B
*
b;
}
;
A 的实现文件如下 A.cpp
void
A::f()
{
b
->
g();
}
B的头文件如下 B.h
class
B
{
void
g();
private
:
A
*
a;
}
;
B的实现文件如下 B.cpp
void
B::g()
{
a
->
f2();
}
看了上面的声明, 基本很多人都会说,这不是典型的前向声明的应用吗? 是的, 没错,因为你在A.h中你只用到B的指针,所以不需要关心B的具体结构,只需要告诉编译器B是一个类型就够了。
但我的疑问是A.cpp中调用的了B的方法,这个时候该怎么办呢? 后来问了别人, 在A.h中添加class B; 前向声明告诉编译器这是一个类型就可以了。然后在A.cpp中#include "B.h", 这样就可以使用B中的方法了(因为B中的声明就会插入到A.cpp中了), 所以编译器处理后A.cpp就会变成下面这样
class
B;
class
A
{
void
f();
void
f2();
private
:
B
*
b;
}
;
class
B
{
void
g();
private
:
A
*
a;
}
void
A::f()
{
}
void
A::f2()
{
}
这样A,B的相互应用就可以解决了
如果只是在A.h 中include“B.h", 在 “B.h中include "A.h"
则最后A.cpp 变成下面的
class
B
{
void
g();
private
:
A
*
a;
}
class
A
{
void
f();
void
f2();
private
:
B
*
b;
}
;
void
A::f()
{
}
void
A::f2()
{
}
这样解析B时,不知道A是类型,就会编译出错
关于另外一个问题, A, B都要使用一个共有变量, 那么可以如下
在A.h中 extern int height; (告诉编译器在外部文件找,即某个cpp中文件中)
在A.cpp中定义, int heght = 5;
在B.h中include A.h
在B.cpp(include了B.h),那么最后B.cpp中有如下的声明
extern int height; 则连接阶段就会在某个cpp文件中去寻找
posted @
2011-03-13 22:13
liuwei 阅读(374) |
评论 (0)
|
编辑
收藏
仅列出标题
Powered by:
C++博客
Copyright © liuwei