C++中基础类互相引用带来的问题

C++两个类互相调用彼此的方法 两个类A和B实现互相调用彼此的方法,如果采用彼此包含对方头文件的方式会出现循环引用,所以采用了类的前置声明的方式 1,class A采用前置声明的方式声明class B 2,在ClassB的头文件中包含class A 的头文件 3,在class A中只能声明class B类型的指针或者引用 具体代码如下: A.h: #pragma once class B; class A { pu 阅读详情

在一些大的工程中,可能会包含几十个基础类,免不了之间会互相引用(不满足继承关系,而是组合关系)。也就是需要互相声明。好了,这时候会带来一些混乱。如果处理得不好,会搞得一团糟,根据我的经验,简单谈谈自已的处理办法:

编码时,我们一般会尽量避免include头文件,而是采用声明 class XXX。但有时候还是必须用Include头文件,那么,两者的划分在于什么呢?

应该是很明确的,但书上好像都少有提及。

首先:
我们要明白为什么要用声明取代头文件包含:对了,是为了避免无必要的重编译(在头文件发生变更时)。工程较大,低速机,或基础类经常变更(不合理的设计吧),编译速度还是会在意的,另外,更为重要的是,采用声明可降低代码(class)之间的藕合度,这也是面向对象设计的一大原则。

二:一般原则:
a.
头文件中尽量少include, 如果可以简单申明 class clsOld; 解决,那最好。减少没有必要的include;
b.
实现文件中也要尽量少include,不要include没有用到的头文件。

三:那什么时候可以只是简单声明class clsOld呢?
简单的说:不需要知道clsOld的内存布局的用法都可以(静态成员除外),也就是讲如果是指针或引用方式的都行。
比如:
   clsOld * m_pOld;    //
指针占4个字节长
   clsOld & test(clsOld * pOld) {return *pOld};
 
一切OK。

四:什么时候不能简单声明class clsOld,必须include呢?
不满足三的情况下:
 
比如:
         clsOld m_Objold;  //
不知道占据大小,必须要通过它的具体声明来计算
原因很简单,想想你要计算sizeof(classNew),但连clsOld的size都不知道,编译器显然会无能为力。

特殊情况:
          int test() { return clsOld::m_sInt;}
    
静态成员调用,想来应该是不需要知道内存布局的,但因为需要知道m_sInt是属于clsOld命名空间的,如果只声明class xxx显然是不足以说明的,所以必须包含头文件。

综上所述,我有以下几点建议:
1
:如果有共同相关依赖(必须include)的类,比如 A,B都依赖D 可以放在一起,然后直接 Include "d" 类的使用者只需关心与本类暴露出的相关类型,内部用到的类型不用去管(不用自已去include d)。这样给出的class,调用者才更好用(不用去看代码查找,是不是还需要包含其它头文件)。

2:如果A类依赖D B类不依赖D,可以把它们分开两个头文件。各自Include。这样可避免当D发生变化时,避免不必要重编译。

3:类中尽量采用指针或引用方式调用其它类,这样就可以只声明class xxx了。并且这也符合资源最优利用,更利于使用多态。


 
c++中两个类互相包含引用怎么处理 写代码的时候,有时候会遇到A类需要调用B类的函数;B类有需要调用A类中的函数;那么这时候要怎么处理呢? 阅读详情

相关推荐

【C++】类与类之间互相包含、引用的解决方法。

在做项目时遇到了下面的问题:error C2146: 语法错误 : 缺少“;”(在标识符“User”的前面)error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 interror C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 intUser是我自己定义的一个类。这个报错在另一个类Room里,Room的类的成员中,含有一个User ...

qq_22993395的博客 2727

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

但是对于如果想要在一个类中定义对象来说比如 在A,H文件中定义B类对象这样的话 就需要 在A.H中包含B类头文件 #include “B.H” 我觉得吧 只有包含了一个类的头文件 这样相当于把这个类定义插入到里面了 所以可以直接定义对象 定义对象需要实在的内容 而不仅仅是知识声明一下类 说明这个类是个标识 必须定义好实体内容 这样才可以 定义变量。这种定义方式类同程式中的死循环。在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型。

az44yao的专栏 1133

【C/C++】解决“两个类的头文件相互引用/超前引用”问题的方法

一、什么是超前引用? 所谓超前引用是指一个类型在定义之前就被用来定义变量和声明函数。一般情况下C/C++要求所有的类型必须在使用前被定义,但是会存在一些特殊情况导致这种要求无法满足,例如 //类A的头文件 #ifndef _A_H_ #define _A_H_ #include "B.h" class A { public: int x; B b; } #enif //类B的头文件 #ifndef _B_H_ #define _B_H_ #include "A.h" class ..

qq_34018840的博客 5291

C++两个类相互引用的问题

c++中常会出现两个类相互引用的问题,如果直接相互引用对方的头文件,编译时会报错

随便记点东西 2500

C++中两个类中互相引用

有时候,我们会有两个类需要互相引用的场景,由于两个类的定义是有顺序的,因此两个类相互引用,不管哪个类在前面,都会出现有一个类未定义的情况。这时可以通过类的前置声明来提前告诉编译器,所要引用的是个类,但由于此时后面的那个类还没有定义,因此无法给对象分配确定的内存空间,故只能使用类指针而不能是类实体。// A.h #include "B.h" class A { public: A(B* pB)

jiange_zh的博客 2830

C++中两个类互相包含

今天突然想起一个C++的问题,如果一个类A包含类B的实例,而实例B也包含另一个类A,这种方式的代码应该怎么写,按照一般的开发者的想法的代码如下:文件A.h#include "B.h" #include <iostream>using namespace std;class A { public: int i; B b; }文件B.h#include "A.h" #include <i

StephenZou14的博客 9275

类之间相互引用,报错类未定义;

今天学习c++时因为需要相互应用两个类,但是引用时报错类未定义; 因为仅仅是用include的方式相互引用了两个类的头文件,导致其中一个类未定义的问题; 解决方案:对其中一个类进行显示声明; ...

qq_44664843的博客 758

机器学习面试笔试求职必背!八股文(1/5)

算法工程师,技术软件类求职机器学习必背八股文 更多算法/业务/HR面等笔试题面试题 —— >个性签名自取! 1. 特征工程: 1.1 为什么要对特征做归一化处理: Feature scaling,常见的提法有“特征归一化”、“标准化”,是数据预处理中的重要技术。特征间的单位(尺度)可能不同,比如身高和体重,比如摄氏度和华氏度,比如房屋面积和房间数,一个特征的变化范围可能是[ 1000 , 10000 ] [1000, 10000][1000,10000],另一个特征的变化范围可能是[ −.

大厂offer宝典 1万+

关于c++类模板及连接问题解决方法

这个是鄙人发表一篇论坛,刚结帖,由于没有回复次数,导致没写结贴总结,在这写下结贴总结,也希望以后也出现此问题的朋友们知道怎么处理: 论坛链接:http://bbs.youkuaiyun.com/topics/392016457#new_post 总结: 1、通过一楼的提示,我百度了一下,看到这篇博客后,知道所以然了:https://zm12.sm-tc.cn/?src=http%3A%2F%2Fwww.

哈哈沃的博客 1362

R语言实战:5分钟搞定相加交互效应分析(逻辑回归/Cox回归/GLMM/GEE全支持)

本文详细介绍了如何利用R语言中的`scitable`包快速实现相加交互效应分析,支持逻辑回归、Cox回归、GLMM和GEE等多种模型。通过自动化计算RERI、AP和SI等指标,大幅提升临床研究和流行病学分析的效率与准确性,特别适合处理多因素联合作用的复杂场景。

fanta的博客 669

UCIe物理层 —— 逻辑协议 (2)

本章开始主要介绍UCIe协议第四章,物理层逻辑定义和规范。如其他的通信协议一样,接口的物理层包含两个部分,逻辑子层和电气子层。其中逻辑层主要负责:1.定义接口信号和时序2. 定义发送端如何将上层数据分发到各个物理通道以及接收端如何把从各个通道收到的数据恢复成byte stream(Flit)。3. Broken Lane的repair和remap。4. 链路初始化,训练(training)和电源状态管理/切换。5. 扰码Scrambling和training sequence的产生。

m0_47581558的博客 1477

C++两个类互相引用的解决方法

问题描述:c++在使用过程中遇到两个类需要相互包含引用的问题 解决办法:两个类的头文件之中,选一个包含另一个类的头文件,另一个头文件中采用class ;的申明形式,在实现文件中(.cpp)中包含头文件,如下所示: class A.h #include "B.h" class A { int m; B b; } class B.h class A; class B { int n; A *a; } B.cpp //在B.cpp中的文件包含A.h,否则不能调用成员a的任何内容 #incl

u012321968的博客 716

2023年全国城市房价分布网格数据

本文介绍了一份2023年全国主要城市房价分布的网格数据,数据以250米×250米的网格为单位,记录了住宅小区数量、均价、最高价和最低价等信息。数据采用GCJ-02坐标系,提供ShapeFile、GeoJSON和CSV三种格式

J_Giser的博客 375

C++类互相引用

C++中经常会遇到一个问题:两个类之间互相用到对方。 问题: 这种是不是一个好的设计? 如果不是一种好的设计,有什么办法规避? 如果没办法规避,代码应该如何写来避免出现各种编译或运行问题? 参考: https://stackoverflow.com/questions/4964482/how-to-create-two-classes-in-c-which-use-each-other-as-data 问题举例 File: bar.h #ifndef BAR_H #define BAR_H #include

wqfhenanxc的专栏 811

dex2oat编译优化调试

dex2oat编译调试的一些技巧和方法

jidapenglin28的专栏 5045

游戏大厂射击游戏无缝大世界游戏DS服务器架构设计方案详解

摘要: 本文深入解析游戏大厂无缝大世界射击游戏的分布式服务器(DS)架构设计方案。以《和平精英》《量子特攻》为例,阐述如何通过动态分区、兴趣管理、弹性扩缩等核心技术应对高并发、低延迟、无缝切换等挑战。架构分为世界协调层、分区计算层、物理判定层等模块,结合微服务化、快照同步和Kubernetes调度,实现玩家跨区无感知迁移与一致判定。重点优化动态负载均衡、状态同步算法及容灾备份,依托分布式数据库与多云部署保障高可用性,为同类游戏提供可扩展的技术范本。(149字) 关键词: 无缝大世界、分布式服务器、动态分区、

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 563

c++中两个类互相引用的问题

最近在改一个C++程序的时候碰到一条警告信息,警告信息为:“                 删除指向不完整“Q2DTorusNode”类型的指针;没有调用析构函数                 1> c:\users\lxw\desktop\dragonfly第二阶段实验\最终的实验版本\实验目录\dragonfly_modify\src\Q2DTorus.h(6) : 参见“Q2DT

222

云端全自动AI漫剧生成工作流:从模型选型到完整实现

本文提出了一套云端全自动AI漫剧生成工作流解决方案,旨在解决传统漫剧制作效率低下的问题。该系统采用"编排引擎+模型矩阵"架构,通过集成大语言模型、图像生成、视频合成等技术,实现从剧本输入到成片输出的全流程自动化。 核心内容包括: 模型选型方案:剧本解析采用DeepSeek-V3/GPT-4o,图像生成使用DALL-E 3,视频合成选用Stable Video Diffusion,语音合成采用MiniMax TTS 系统架构设计:基于Celery分布式任务队列的编排层,分解任务至各功能模块

huanghm88的专栏 640

C++ 两个类头文件互相引用

好苦逼 今天被两个 类头文件 整的 欲哭无泪!     因为定义了两个类,这两个 类 如果互相引用到,然鹅。。我凌乱了,本以为是只要两个都类定义的头文件只要 互相    包括 include 就搞定了,就没想到 以为 如此简单 ,我弄了一下午,有一点点弄明白了!。    这里我跟大家分享一下把,也算自己记录一下!。     首先 咱先 来 个死循环压压惊。。一杯咖啡的时间。保证cp

是宿醉还是离别 2万+

USB_TYPE-C 母座电路设计

本文详细介绍了USB Type-C接口(C2765186)的电路设计要点,重点解析了电源、识别和数据三部分的关键连接方案。电源部分需并联VBUS和GND引脚并加宽走线以承载3A电流;识别部分必须为CC1/CC2引脚配置5.1kΩ±1%精度的下拉电阻,这是触发PD充电的核心条件;数据部分通过短接正反插引脚实现盲插功能。文档还提供了完整的引脚对照表,并强调PCB布局需注意ESD防护、差分走线阻抗控制等要点,为Type-C接口设计提供了实用指导。

在读研究生,FPGA电路设计与功能开发。 583

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

解决C++中两个类的头文件互相包含问题

c++常见问题

weixin_44216359的博客 4546

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++中两个类互相引用的解决方法

一、问题描述 现在有两个类A和B需要定义,定义A的时候需要用到B,定义B的时候需要用到A。 二、分析 A和B的定义和调用都放在一个文件中肯定是不可以的,这样就会造成两个循环调用的死循环。 根本原因是:定义A的时候,A的里面有B,所以就需要去查看B的占空间大小,但是查看的时候又发现需要知道A的占空间大小,造成死循环。 解决方法1: (1)写两个头文件A.h和B.h分别用于声明类A和B;

西青年·部落格 2万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【C++】两个类的相互引用

有时候在设计数据结构的时候,可能会遇到两个类需要相互引用的情形。比如类A有类型为B的成员,而类B又有类型为A的成员。 那么这种情形下,两个类的设计上需要注意什么呢? 本文实例源码github地址:https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2021Q1/20210103。 同一文件 尝试方案 将A和B的定义都放在一个文件中,例如: #include <iostream> class A { public: A()

Yngz_Miao的博客 2万+
上一篇: 生于七八十年代,我们的童年是这样的
下一篇: 网管请别随意关闭Windows默认共享
sumless
博客等级 码龄23年 2粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值