summer's C++ house

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  1 随笔 :: 0 文章 :: 0 评论 :: 0 Trackbacks
最近在写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 on 2011-03-13 22:13 liuwei 阅读(375) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理