在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类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()
{
……
}

两个类互相用包含

2009-06-14 00:15

当两个类互相包含 互相在本类中定义另外一个类的对象指针引用时候

因为必须保证当一个类先声明或者定义时候才可以在另外一个类中使用

所以对于类A B 需要在类A中定义一个B类的对象 指针或引用 在B类中定义一个A类的对象 这样互相包含

时候 就需要先在类中什么一下要用的类

如在类A的前面声明Class B 在B类前声明Class A

然后在头文件或者CPP文件中加入B.H

或则A.h 这样就可以互相定义而不产生错误了

但是要注意的是上述的方法是只适用于用来定义类指针或者类应用

而不能来定义类对象变量或者函数的变量名 这是因为上面仅仅声明了类 说明这个类是一个标识 还没有实现所以不能定义对象变量

但是对于如果想要在一个类中定义对象来说比如 在A,H文件中定义B类对象这样的话 就需要 在A.H中包含B类头文件 #include “B.H” 我觉得吧 只有包含了一个类的头文件 这样相当于把这个类定义插入到里面了 所以可以直接定义对象 定义对象需要实在的内容 而不仅仅是知识声明一下类 说明这个类是个标识 必须定义好实体内容 这样才可以 定义变量

而这种情况下 不能两个类互相包含了 我一般所见的内容就是定义了B类对象变量后 则只能在B.H中定义 A类指针或者引用了 所以就在B.H里面声明 CLASS A; 声明了 就是如此了

确实一般都是如此 两个类一个包含头文件 另外一个声明类 另外在实现文件中当然还得包含这个头文件了 不要忘了这个 而以为不用包含头文件 仅仅声明了类就OK

所以一旦是个类名字声明 则只能是定义对象指针或引用(无论是单个定义还是对于函数参数 定义都如此) 包含就都可以了

我觉得不能每个里面都定义对象变量 最多一个 否则会产生 死循环

只是不知道要是需要定义两个对象变量 或者三个类或以上的这样时候会怎么样啊

倒是确实是当UpdateData(FALSE)是把数据从变量传递到控件中 而TRUE是把控件中内容传递到变量中

两个不同的类相互引用的情况下头文件包含问题

两个类相互包含引用的问题--类前向声明相关推荐

  1. 两个类相互包含对方成员的问题(2)

    1 //A.h文件 2 #ifndef A 3 #define A 4 #include"B.h" 5 static int count=0; 6 class A 7 { 8 pu ...

  2. C++ 头文件的相互包含问题C2504未定义基类 | C2143,C4430,C2238

    文件相互包含的错误问题 序言 可能会有的疑问 原因分析 C2504: 未定义的基类 C2143: 语法错误: 缺少";"(在"*"的前面) C4430: 缺少类 ...

  3. C++ 类的前向声明

    前向声明 在计算机程序设计中, 前向声明是指声明标识符(表示编程的实体,如数据类型.变量.函数)时还没有给出完整的定义.即可以声明一个类而不定义它,只声明类但不知道类的成员变量.函数等具体细节. 如: ...

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

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

  5. cocos 时间函数需要什么引用_Cocos Creator两个类相互引用(调用)

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

  6. idea中同一个包中的类相互引用失败

    idea类相互引用失败 问题描述: 在开发过程中,从git上拉取项目,发现同一包下的两个类在相互引用时出错,无法找到对应类,无法运行.困扰好久,记录一下解决办法 原因分析: 由于是同一包下的两个pub ...

  7. 分别声明Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)类。要求: (1)在两个基类中都包含姓名、年龄、性别、地址、电话等数

    分别声明Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部)类.要求: (1)在两个基类中都包含姓名.年龄.性别.地址.电话等数 ...

  8. Java黑皮书课后题第6章:6.9(英尺和米之间的转换)编写一个类,包含如下两个方法:编写一个测试程序,调用这两个方法以显示下面的表格

    6.9(英尺和米之间的转换)编写一个类,包含如下两个方法:编写一个测试程序,调用这两个方法以显示下面的表格 题目 题目概述与运行示例 破题 代码(本题) 题目 题目概述与运行示例 6.9(英尺和米之间 ...

  9. 4.定义并实现一个Person类,包含姓名(name)与编号(code)等两个属性,通过构造函数为属性赋值,拥有显示属性值的方法(showInfo)。从Person类派生出一个Student类,拥有数

    package monster.zf.Test; /*** 4.* 定义并实现一个Person类,包含姓名(name)与编号(code)* 等两个属性,通过构造函数为属性赋值,拥有显示属性值的方法(s ...

最新文章

  1. pc双网卡实现路由转发_route命令如何使用?如何利用route命令实现内外网切换?...
  2. 智能安防新时代:用户、SI、设备制造商要做什么?
  3. 公共方法-利用for else搜索字典列表-for else
  4. centos6.8安装docker
  5. MyEclipse+JavaEE+jsp+sqlsever实现产品售后服务系统
  6. python爬取数据需要注意的问题
  7. C#快速找出磁盘内的所有文件
  8. 兴利调节matlab编程,水利计算之兴利调节计算.ppt
  9. 栈的基本操作(详细)
  10. arcgis 发布服务
  11. 如何解决“数据错误,循环冗余检查”
  12. Nvidia Deepstream极致细节:3. Deepstream Python RTSP视频输出显示
  13. 解答为什么@Autowired使用在接口上而不是实现类上
  14. 樱花飘落的季节——樱花(Python代码实现)
  15. 使用STM32CubeMX 快速生成 USB HID 工程 - STM32F107VCT6
  16. 数据仓库DW、ODS、DM及其区别
  17. 小学期 异形:达达学长的生死逃亡
  18. 【数据库】python连接数据库(保姆式服务,一口一口喂啊歪)
  19. LHS 查询和 RHS 查询
  20. 关于OpenGL的天空盒的理解

热门文章

  1. 微软职位内部推荐-Software Development Engineer II
  2. [转载] 七龙珠第一部——第004话 掳人的妖怪——乌龙
  3. DataGrid和GridView单击背景变色双击颜色还原
  4. 利用JS中window.showModalDialog()详解
  5. mysql 4.0.27 下载,CentOS编译Mysql 4.0.27数据库问题解决
  6. java ftp模糊查询_linux怎么模糊查找一个文件
  7. python实时读取日志并打印关键字怎么实现_面试宝典_Python.运维开发.0004.用Python实现tail实时输出新增日志?...
  8. linux qt 连接sqlite3,RedHat 9 Linux下在QT3.1中连接SQLite3全过程详细记录
  9. java 常用方法_Java常用方法总结(持续更新中)
  10. 位序、字节序、类型序