• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
james1207

博客园    首页    新随笔    联系   管理    订阅  订阅

如何让两个文件的两个类相互关联

做项目过程中,一般会遇到两个类相互关联的情况,而这两个类又分别放在两个不同文件中,所以就“情不自禁”地相互包含对方的头文件,然后就“理所应当”地编译错误了。在这里,就讲一下如何让位于不同文件的的两个类相互关联。

 

首先设计类A(包括头文件classA.h和源文件classA.cpp),其中头文件classA.h要#include "classB.h",而源文件classA.cpp又#include"classA.h。这样,在头文件classA.h和源文件classA.cpp都可以使用类B的东西了。

 

头文件classA.h源码如下:

 

#ifndef _CLASSA_H_
#define _CLASSA_H_
 
#include "classB.h"
 
class A{
      public:
             void display();
             void callB(B *b);
};
 
#endif

 

源文件classA.cpp源码如下:

 

#include <iostream>
#include "classA.h"
 
using namespace std;
 
void A::display(){
     cout<<"this is class A"<<endl;
}
 
void A::callB(B *b){
     b->display();  
}

 

其次设计类B(包括头文件classB.h和源文件classB.cpp),这里,头文件classB.h是不能#include "classA.h",因为这样会和头文件classA.h形成相互包含,从而编译错误。那怎么样才能让头文件classB.h和源文件classB.cpp也都可以使用类A的东西呢?可以这样:头文件classB.h中声明类A,源文件classB.cpp中#include "classA.h"。头文件classB.h中声明类A,就是要告诉本模块类A是一个在其他地方声明定义的东西,在这里可以使用这个东西的名字,但由于还不知这个东西的具体定义,所以不能再这里实例化这个东西。

 

头文件classB.h源码如下:

 

#ifndef _CLASSB_H_
#define _CLASSB_H_
 
class A;
class B{
      public:
             void display();
             void callA(A *a);
};
 
#endif

 

源文件classB.cpp源码如下:

 

#include <iostream>
#include "classB.h"
#include "classA.h"
 
using namespace std;
 
void B::display(){
     cout<<"this is class B"<<endl;
}
 
void B::callA(A *a){
     a->display();    
}

 

到这里,我们可以设计一个场景(main文件),源码如下:

 

#ifndef _MAIN_CPP_
#define _MAIN_CPP_
 
#include <iostream>
#include "classA.h"
#include "classB.h"
 
using namespace std;
 
int main(){
    int pause;
   
    A *ap = new A();
    B *bp = new B();
   
    ap->callB(bp);
    bp->callA(ap);
   
    cin>>pause;
    return 0;
}
 
#endif

 

运行结果如下:

 

 

可以看出:

类A调用了callB(B *b),而callB又调用了类B的display()

类B调用了callA(A *a),而callA又调用了类A的display()

posted @ 2013-08-16 19:28  Class Xman  阅读(1083)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3