在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类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()
{
……
} 两个类互相用包含 -- : 当两个类互相包含 互相在本类中定义另外一个类的对象指针引用时候 因为必须保证当一个类先声明或者定义时候才可以在另外一个类中使用 所以对于类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是把控件中内容传递到变量中 两个不同的类相互引用的情况下头文件包含问题

C++中两个类相互包含引用问题的更多相关文章

  1. 多态时最好将基类的析构函数设为virtual、 C++中两个类相互包含引用问题 (转载)

    多态:http://blog.csdn.net/tmljs1988/article/details/8146521 C++中两个类相互包含引用问题:http://blog.csdn.net/leo11 ...

  2. c++中两个类相互包含引用的相关问题

    在构造自己的类时,可能会遇到两个类相互引用的问题. 例如: class A { int i; B b; }; class B { int i; A a; }; 在这种情况下,这样就会出现一个死循环a. ...

  3. C++两个类相互包含引用的问题

    在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; } class B { A* a; } 请 ...

  4. C++中两个类相互include的问题

    在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 例如: Cup.h #ifndef CUP_H #define CUP_ ...

  5. 转载:C++中两个类中互相包含对方对象的指针问题

    原文链接:http://www.cnblogs.com/hanxi/archive/2012/07/25/2608068.html 前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某 ...

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

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

  7. 关于node中两个模块相互引用却不会死循环的问题

    关于node中两个模块相互引用却不会死循环的问题 node中是通过require来导入加载模块的,require有两个作用: 1.加载文件模块并执行里面的代码 2.拿到被加载文件模块导出的接口对象 现 ...

  8. c++两个类相互调用

    有可能会碰到两个类之间的相互调用的问题,例如:定义了类A和类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; }; class B { A a; }; 编译器在声明A ...

  9. C++学习笔记一 —— 两个类文件互相引用的处理情况

    先记录一些零碎的知识点: 1. 一个类可以被声明多次,但只能定义一次,也就是可以 class B;  class B;  class B; ……;  class B {……};  这样子. 2. 一个 ...

随机推荐

  1. ssh登录慢的解决办法

    ubuntu的ssh登录有点慢,其实是很慢 google了一把,发现可以这样解决: (1)可能是DNS反向解析的问题 对于这样的问题,可以在/etc/ssh/sshd_config 中添加/修改: U ...

  2. VueJS表单控件操作

    概念说明 v-model指令:在表单控件元素上创建双向数据绑定.v-model 会根据控件类型自动选取正确的方法来更新元素. 输入框 实例中演示了 input 和 textarea 元素中使用 v-m ...

  3. vim 穿越时空

    1. 回到以前的文件状态 :earlier 3m   回到文件3分钟之前的状态 2. 回到以后的文件状态 :later 3m      回到文件3分钟之后的状态 3. 时间单位 s 秒 m 分钟 d ...

  4. spring-web中的StringHttpMessageConverter简介

    spring的http请求内容转换,类似netty的handler转换.本文旨在通过分析StringHttpMessageConverter 来初步认识消息转换器HttpMessageConverte ...

  5. 《C专家编程》数组和指针并不同--多维数组

    <C专家编程>数组和指针并不同 标签(空格分隔): 程序设计论著笔记 1. 背景理解 1.1 区分定义与声明 p83 声明相当于普通声明:它所说明的并不是自身,而是描写叙述其它地方创建的对 ...

  6. 平滑处理 - cvSmooth() 函数实现

    前言 平滑是图像处理中很重要的操作,其主要用途是降噪.Open CV 提供了 5 种不同的平滑方法:简单模糊,简单无缩放变换的模糊,中值模糊,高斯模糊和双边滤波,它们都通过函数 cvSmooth 实现 ...

  7. SAP Sybase SQLAnywhere[ASA]数据库中数据行的存储机制

    SQLAnywhere[ASA]数据库(以下简称ASA)中的数据库文件,是如何存储普通的表的记录行呢?插入.更新.删除时,记录行的存储会有什么变化? 了解了这些,才能更好的理解如何对ASA数据库进行调 ...

  8. php类中const

    常量 const 在类里面定义常量用 const 关键字,而不是通常的 define() 函数. 语法: const constant = "value"; 例子: <?ph ...

  9. Windows 下Nexus搭建Maven私服

    nexus下载地址: http://www.sonatype.org/nexus/archived/#step2top 1. 为什么使用Nexus 如果没有私服,我们所需的所有构件都需要通过maven ...

  10. java基本类型和包装类的区别(转)

    int 是基本类型,直接存数值 Integer是类,产生对象时用一个引用指向这个对象 Java把内存划分成两种:一种是栈内存,另一种是堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数 ...