C++类相互包含
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++类相互包含的更多相关文章
- 多态时最好将基类的析构函数设为virtual、 C++中两个类相互包含引用问题 (转载)
多态:http://blog.csdn.net/tmljs1988/article/details/8146521 C++中两个类相互包含引用问题:http://blog.csdn.net/leo11 ...
- C++两个类相互包含引用的问题
在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; } class B { A* a; } 请 ...
- c++中两个类相互包含引用的相关问题
在构造自己的类时,可能会遇到两个类相互引用的问题. 例如: class A { int i; B b; }; class B { int i; A a; }; 在这种情况下,这样就会出现一个死循环a. ...
- C++中两个类相互包含引用问题
在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { int i; B b; } class B { in ...
- qt c++对象头文件如何相互包含
今天在写qt时,遇到了两个类相互包含的问题,类A要用到类B,类B要用到类A. 类A:a.h #ifndef A_H #define A_H #include <b.h> class A { ...
- C++类包含问题(重复包含和相互包含)
一.重复包含头文件 头文件重复包含,可能会导致的错误包括:变量重定义,类型重定义及其他一些莫名其妙的错误.C++提供两种解决方案,分别是#ifndef和#pragma once #ifndef _SO ...
- c++两个类相互调用
有可能会碰到两个类之间的相互调用的问题,例如:定义了类A和类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; }; class B { A a; }; 编译器在声明A ...
- C/C++ 中头文件相互包含引发的问题
转自:http://blog.csdn.net/hazir/article/details/38600419 今天下午遇到一个头文件相互包含而导致的编译问题,花了我不少时间去调试没找到问题,最后晚上跟 ...
- C++中两个类相互include的问题
在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 例如: Cup.h #ifndef CUP_H #define CUP_ ...
- 下位机多个".c, .h"文件的相互包含及排版
一.背景: 自从接触单片机编程以来,由于工作上的需要,不可避免的时常会接手别人的代码,但常常由于上一位同事的编码随意性有点大,导致可读性非常的差,有时候不得不完全舍弃原有代码,推倒重来,无形中增加了工 ...
随机推荐
- Django框架表单基础
本节主要介绍一下Django框架表单(Form)的基础知识.Django框架提供了一系列的工具和库来帮助设计人员构建表单,通过表单来接收网站用户的输入,然后处理以及响应这些用户的输入. 6.1.1 H ...
- 使用expected_conditions的url_changes方法判断是否登录成功
使用expected_conditions的url_changes方法判断是否跳转页面登录成功 from selenium import webdriver from selenium.webdriv ...
- P6419 COCI2014-2015#1 Kamp
P6419 COCI2014-2015#1 Kamp 换根 \(dp\) 的 trick. 题面 钦定 \(k\) 个关键点,求每个点出发,访问完所有关键点的距离最小值. 思路 设 \(g_u\) 为 ...
- PbRL | Christiano 2017 年的开山之作,以及 Preference PPO / PrefPPO
PrefPPO 首次(?)出现在 PEBBLE,作为 pebble 的一个 baseline,是用 PPO 复现 Christiano et al. (2017) 的 PbRL 算法. For eva ...
- 鸿蒙NEXT开发案例:随机数生成
[引言] 本项目是一个简单的随机数生成器应用,用户可以通过设置随机数的范围和个数,并选择是否允许生成重复的随机数,来生成所需的随机数列表.生成的结果可以通过点击"复制"按钮复制到剪 ...
- 三、FreeRTOS学习笔记-系统配置
FreeRTOSConfig.h配置文件作用:对FreeRTOS进行功能配置和裁剪,以及API函数的使能. 系统配置文件中主要是一些宏定义 相关宏定义可分为三类: 1."INCLUDE&qu ...
- docker之网络与数据管理
docker默认使用bridge(单主机互联)和overlay(可跨主机互联)两种网络驱动来进行容器的网络管理.如需要,还可以自定义网络驱动插件进行docker容器的网络管理. 1.docker默认网 ...
- MySQL底层概述—6.索引原理
大纲 1.索引原理 2.二叉查找树 3.平衡二叉树(AVL树) 4.红黑树 5.B-Tree 6.B+Tree 7.Hash索引 8.聚簇索引与非聚簇索引 1.索引原理 索引会在数据文件中(ibd文件 ...
- canvas实例:绚丽小球
1.思路分析 监听页面尺寸变化(防抖),动态设置canvas大小 监听鼠标移动事件(节流),动态创建小球,小球包含大小,原点坐标,移动方向等信息,其内部方法支持移动和缩小 开启定时器,更新画布内容(清 ...
- 零基础学习人工智能—Python—Pytorch学习(十)
前言 本文的内容是来自教程视频的第十五集,个人感觉,这个教程是有点虎头蛇尾,就是前面开始的教程,是非常惊人的好,但到这里,就有点水了,可以说就是把代码一铺,然后简单介绍一遍,很多细节都没有讲,所以,我 ...