两个类相互包含引用的问题

不管是下文中提到的例子,还是任何情况,使得class A的头文件需要include class B的头文件,class B的也要引用A的头文件,这种状况下,貌似会出现有一个类未定义的问题从而无法通过编译。 
解决办法是: 
A或者B任选一个采用头文件(A.h)引用另一头文件(B.h)的方式不变,而另外一方的头文件(B)中则在定义该类之前写一句class A;然后在B的cpp文件中引用A的头文件。 
================================================================ 
(下文为转载) 
在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 
class A 

    int i; 
    B b; 
}

class B 

    int i; 
    A* a; 
}

请注意上面的定义内容,一般情况下是不能出现类A,类B相互引用都定义对象,即如下的样子: 
class A 

  int i; 
  B  b; 
}

class B 

  int i; 
  A   a; 

在这种情况下,想想可以有a.b.a.b.a.b.a.b.a.b…………,很有点子子孙孙无穷尽之状,那么我的机器也无法承受。最主要的还是这种关系很难存在,也很难管理。这种定义方式类同程序中的死循环。所以,一般来说,两者的定义,至少有一方是使用指针,或者两者都使用指针,但是决不能两者都定义实体对象。

言归正传,那么,在定义时因为相互引用肯定会需要相互包含头文件,如果仅仅只是在各自的头文件中包含对方的头文件,是通不过编译的,如下: 
//class A.h 
#include "B.h" 
class A 

  int i; 
  B   b; 
}

//class B.h 
#include "A.h" 
class B 

  int i; 
  A *a; 
}

如上的包含方式可能会造成编译器有错误提示:A.h文件中使用了示知类型B。 
怎么办? 
一般的做法是:两个类的头文件之中,选一个包含另一个类的头文件,但另一个头文件中只能采用class *;的申明形式,而在实现文件中(*.cpp)中包含头文件,如下: 
//class A.h 
#include "B.h" 
class A 

  int i; 
  B   b; 
}

//class B.h 
class A; 
class B 

  int i; 
  A *a; 
}

//B.cpp 
//在B.cpp中的文件包含处要有下面语句,否则不能调用成员a的任何内容 
#include "A.h" 
B::B() 

…… 

C++类间相互引用的更多相关文章

  1. 利用delegate来解决类之间相互引用问题(引用死锁)

    类之间相互引用--类A中需要调用类B中的方法,同时,类B中又要调用类A中的方法.(也被称为引用死锁,通常会出现编译错误). 解决方法是,在类A中引用类B,并使类A成为类B的delegate,这样在类A ...

  2. EF webapi json序列化 表间相互引用 无限循环问题解决方案

    WebApiConfig.cs中加入 如下代码即可解决无限循环问题 var json = config.Formatters.JsonFormatter; // 解决json序列化时的循环引用问题 j ...

  3. C++类的交叉引用

    对于C++中,两个类中相互引用对方,当然只能是在指针的基础上,于是我们知道.也就是说在A类的有一个指针引用B类的成员函数或成员对象,而B类中又有一个指针来访问A中的成员函数或对象.这就是C++中类的交 ...

  4. Cocos Creator两个类相互引用(调用)

    如果两个类相互引用,脚本加载阶段就会出现循环引用,循环引用将导致脚本加载出错:///////////Game.jsvar Item = require("Item");var Ga ...

  5. C++两个类相互引用错误留影

    java中类相互引用很方便,c++中有编译顺序的问题 c++声明作用,告诉编译器,我声明的东西你要是找不到,那就跳过去吧,等全编译完你就可以找到了. C1.h #pragma once #includ ...

  6. UML(一) 类图及类间关系

    原创文章,同步发自作者个人博客,http://www.jasongj.com/uml/class_diagram/ UML类图 UML类图介绍 在UML 2.*的13种图形中,类图是使用频率最高的UM ...

  7. 【原创】面向对象作业:选课系统中用pickle储存多个对象间组合引用关系的那些坑

    转载请注明出处:https://www.cnblogs.com/oceanicstar/p/9030121.html 想直接看结论先提前列出: 1.存储一个对象,文件不是真的给你存储的了对象这种东西, ...

  8. UML中的类间的关系

    1.泛化(Generalization) 指的是子类与父类之间的继承关系,空心三角+实线,箭头指向父类   eg:Father类为Son类的父类     2.依赖(Dependency) 没关系 &g ...

  9. UML类图与类间六种关系表示

    UML类图与类间六种关系表示 1.类与类图 类封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性,操作,关系的对象集合的总称. 类图是使用频率最高的UML图之一. 类图用于描述系统中所包含的 ...

随机推荐

  1. [Socket]Socket聊天小程序

    一个简单是Socket聊天小程序,读写操作在不同的线程中.服务器端采用线程池. 1.Server import java.io.IOException; import java.net.ServerS ...

  2. ansible环境部署及常用模块总结 - 运维笔记

    一.  Ansible 介绍Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于py ...

  3. open-falcon ---客户机agent操作

    open-falcon的agent用于采集机器负载监控指标,比如cpu.idle.load.1min.disk.io.util等等,每隔60秒push给Transfer.agent与Transfer建 ...

  4. svn代码发版的脚本分享

    背景:开发将其代码放到svn里面,如何将修改后存放到svn里的代码发布到线上?简单做法:写个shell脚本,用于代码发版.比如开发的代码存放svn的路径是:svn://112.168.19.120/h ...

  5. Mongodb主从复制/ 副本集/分片集群介绍

    前面的文章介绍了Mongodb的安装使用,在 MongoDB 中,有两种数据冗余方式,一种 是 Master-Slave 模式(主从复制),一种是 Replica Sets 模式(副本集). Mong ...

  6. 12.9 Daily Scrum

    在一些实现上,开发人员提出了意见,经过讨论后,我们决定取消“推荐餐厅”的功能,增加了“菜谱分类”的功能. 同时更新了相关人员的任务.   Today's Task Tomorrow's Task 丁辛 ...

  7. #个人博客作业Week1——流行的源程序版本管理软件和项目管理软件

    1.TFS(Team Foundation Server)(1)定义:TFS是一个高可扩展.高可用.高性能.面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,          它构筑在普通 ...

  8. SRS用例

    团队项目:超市管理系统     作者:王琨  个人博客地址:http://www.cnblogs.com/wangkun123 一. 用例视图概述 一般的超市商品管理系统,主要由五大模块组成,即商品信 ...

  9. T-shirt 0 0....

    老师给我这件T-shirt的目的是为了让我减肥吗...... 听说了pbb的事迹好感动 //偷偷吐槽一句,那个全套吉米多维奇可以报销吗...我就看了2行........ 吓得我赶紧看了一下浴盆的气球

  10. <构建之法>第11、12章

    第11章软件设计与实现 主要讲了典型的开发流程和开发阶段的一些管理方法 问题: 从spec道实现是代码的实现吗? 第12章 用户体验 主要讲了用户体验的各种角度和认识阻力登 问题: 用户的体验是设计前 ...