博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何让两个文件的两个类相互关联
阅读量:4587 次
发布时间:2019-06-09

本文共 1642 字,大约阅读时间需要 5 分钟。

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

 

首先设计类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 
#include "classA.h" using namespace std; void A::display(){ cout<<"this is class A"<
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 
#include "classB.h"#include "classA.h" using namespace std; void B::display(){ cout<<"this is class B"<
display(); }

 

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

 

#ifndef _MAIN_CPP_#define _MAIN_CPP_ #include 
#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()

转载于:https://www.cnblogs.com/james1207/p/3263194.html

你可能感兴趣的文章
CentOS 5.5 Samba服务器安装总结
查看>>
博客园评价
查看>>
Apache commons-io实现多文件读取和写入
查看>>
Bash快捷键整理
查看>>
不写代码也能爬虫Web Scraper
查看>>
转: C#+MAPX 添加线、文本、符号等图元
查看>>
管理机--Jumpserver由docker搭建
查看>>
bzoj2212 Tree Rotations 线段树合并+动态开点
查看>>
SAP CRM 通过调试观察CL_CRM_BOL_ENTITY中的数据
查看>>
2016NOI冬令营day5
查看>>
JavaScript正则表达式-字符
查看>>
php 不等待返回的实现方法(异步调用)
查看>>
Oracle成长点点滴滴(2)— 权限管理
查看>>
Android 离线语音用法(讯飞语音)
查看>>
offsetof(s,m)解析
查看>>
JAVA遇见HTML——JSP篇:JavaBeans
查看>>
mariadb(四)连接查询,视图,事物,索引,外键
查看>>
【翻译】Kinect Studio是? 三月 SDK Update的新机能
查看>>
[BZOJ2654]tree(二分+Kruskal)
查看>>
枚举类型和 struct类型
查看>>