1. 两个类需要相互包含的情景

在观察者模式中,气象站的数据送给某些布告牌。

气象站要知道通知哪些布告牌,所以气象站类至少有一个布告牌类型的链表。

布告牌需要把自己注册到气象站类,告诉气象站类自己已经订阅消息,

注册函数需要气象站类作为形参,才知道自己注册到哪一个气象站。

也就是说,在类定义的时候,他们就是需要对方的!

所以,我需要在各自类定义的头文件中,include对方类所在的头文件?错误!

具体错误类型是:语法错误(标识符)。

2.类(和结构体)是不能相互包含的

类在定义的时候需要知道类的大小,实例化的时候才可以正确分配空间。

假如类A正常定义,类B中有类A,这也是OK的,因为类A大小已知,类B大小也就已知了。

假如A中有B,B中有A呢?A和B都不确定大小,好像进入了一个类似死锁的情景。

A和B都不知道自己实例化对象的时候到底申请多少空间。

同样结构体也是一样,是不可以相互包含的!

3. 如何解决需要相互包含的情景?

①尽量使用指针来解决问题

既然是因为大小不确定,导致的类定义错误,那就使用类的指针来替代类好了,使用起来没有什么区别!

在Linux内核中,结构体特别多,肯定会出现相互包含的情况吧,所以Linux内核中尽量采用结构体指针。

以后我们也尽量使用结构体指针,通过pStruct->fun()来调用方法。

②声明类,而不是包含头文件!

类是在头文件中定义的,类在定义的时候需要包含其他类,所以需要在头文件中包含其他头文件。

思考一下头文件相互include,会出现什么情况?

include就是拷贝的意思,互相include,不就是无限制的拷贝下去吗?

所以头文件的相互包含中也不支持。

有什么解决方法呢?声明类取代include定义:class A;

原来不知道,类也是可以声明的!

③如何调用声明类的成员函数?

在定义类B的头文件中,声明了类A,那么类B中如何调用A.fun()?

编译器又不知道A中有哪些成员函数,声明只是告诉有这个类,不提供其他信息。

所以,不要在类的定义头文件中,使用其他类的方法。

在哪里可以使用其他类的方法?在本类的成员函数的实现的cpp文件中可以!

4.总结的几条重要结论!!!

①在类B的定义头文件中(B.h)不要include其他头文件(A.h)!

②在某个类的定义头文件中(B.h)需要其他类(A.h),使用类的声明(class A;)!

③尽量使用类/结构体指针替代对象!

④在某个类的定义头文件中(B.h),不应该调用其他类的方法(A.fun())!

⑤因为要在类B的成员函数的实现c文件中(B.cpp),才会开始调用A的成员函数(A.fun()),

这个时候在B.cpp中包含include “A.h”就不会出问题了!

参考:

c语言结构体相互引用

C++中两个类相互包含引用问题

C++类相互包含的更多相关文章

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

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

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

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

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

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

  4. C++中两个类相互包含引用问题

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

  5. qt c++对象头文件如何相互包含

    今天在写qt时,遇到了两个类相互包含的问题,类A要用到类B,类B要用到类A. 类A:a.h #ifndef A_H #define A_H #include <b.h> class A { ...

  6. C++类包含问题(重复包含和相互包含)

    一.重复包含头文件 头文件重复包含,可能会导致的错误包括:变量重定义,类型重定义及其他一些莫名其妙的错误.C++提供两种解决方案,分别是#ifndef和#pragma once #ifndef _SO ...

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

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

  8. C/C++ 中头文件相互包含引发的问题

    转自:http://blog.csdn.net/hazir/article/details/38600419 今天下午遇到一个头文件相互包含而导致的编译问题,花了我不少时间去调试没找到问题,最后晚上跟 ...

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

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

  10. 下位机多个".c, .h"文件的相互包含及排版

    一.背景: 自从接触单片机编程以来,由于工作上的需要,不可避免的时常会接手别人的代码,但常常由于上一位同事的编码随意性有点大,导致可读性非常的差,有时候不得不完全舍弃原有代码,推倒重来,无形中增加了工 ...

随机推荐

  1. PC大屏自适应 - 简洁版

    PC大屏自适应通常做法 一般pc端页面布局会取中间一定的宽度,高度自适应.而可视化大屏需要在不同分辨率的显示屏上铺满整个屏幕,这就需要根据屏幕不同分辨率设置不同的宽高也就是自适应布局.在此向小伙伴们推 ...

  2. Air780EP低功耗4G模组AT开发:阿里云应用

    ​ Air780EP是合宙推出的一款低功耗4G全网通模组,兼容模组行业1618经典封装,支持OpenCPU开发及全功能数传AT开发,可广泛应用于多样化的物联网终端. 针对客户朋友需求反馈,本期特别推出 ...

  3. jmeter接口测试应用

    一.jmeter下载 安装jmeter: 地址https://jmeter.apache.org/download_jmeter.cgi 下载 [apache-jmeter-XXX. zip ]解压缩 ...

  4. SQL注入手工注入portswigger labs练习

    目录 1 什么是SQL注入 2 QL注入会发生在哪些地方 3 QL注入的类型有哪些 4 QL注入点如何探测 5 QL注入的一般步骤 6 QL注入的防御 7 SQL注入前需要了解的 8 场训练 port ...

  5. 2025年前端面试准备js篇

    1.js的基本数据类型有哪些 undefined,null,bo0lean,number,string,object,Symbol,bigInt 分为原始类型和引用类型 原始类型:undefined, ...

  6. .NET Core 异步(Async)底层原理浅谈

    简介 多线程与异步是两个完全不同的概念,常常有人混淆. 异步 异步适用于"IO密集型"的场景,它可以避免因为线程等待IO形成的线程饥饿,从而造成程序吞吐量的降低. 其本质是:让线程 ...

  7. KETTLE 复制次数

    作用就是开启多线程. 比如上例设置为6. 总共 17条数据,分为6次执行,可以看出是启用了多线程执行.

  8. openwrt交换机配置命令-swconfig

    swconfig swconfig 是交换接口 (switch) 配置命令. 交换机是二层设备,是我们用来配置vlan的必备利器. 使用swconfig list可以列出当前可用的 SWITCH 设备 ...

  9. 如何为在线客服系统的 Web Api 后台主程序添加 Bootstrap 启动页面

    背景 我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统.这个系统的核心后台主程序,在最早期是完全没有页面,经常有朋友部署之后,一访问是 404,以为没有部署成功.我一看这肯定不行啊,可后 ...

  10. 06C++顺序结构与程序IPO模式

    一.程序IPO模式 编程 IPO 是指输入.处理和输出(Input, Process, Output)的概念.在计算机编程中,IPO 是一种常用的设计模式,用于描述程序的基本流程.具体来说,IPO 指 ...