http://www.eventhelix.com/realtimemantra/headerfileincludepatterns.htm
C++ Header File Include Patterns
Complex software in Realtime systems requires a careful header file management even when programming in C. When developers move to C++, header file management becomes even more complex and time consuming. Here we present a few header file inclusion patterns that will simplify this chore.
Header File Inclusion Rules
Here, we discuss the basic rules of C++ header file inclusion needed to simplify header file management.
- A header file should be included only when a forward declaration would not do the job.
- The header file should be so designed that the order of header file inclusion is not important.
- The header file inclusion mechanism should be tolerant to duplicate header file inclusions.
The following sections will explain these rules with the help of an example.
Header File Inclusion Example
The following example illustrates different types of dependencies. Assume a class A with code stored in a.cpp and a.h.
a.h
-
#ifndef _a_h_included_
-
#define _a_h_included_
-
#include "abase.h"
-
#include "b.h"
-
// Forward Declarations
-
class C;
-
class D;
-
class A : public ABase
-
{
-
B m_b;
-
C *m_c;
-
D *m_d;
-
-
public:
-
void SetC(C *c);
-
C *GetC() const;
-
-
void ModifyD(D *d);
-
};
- #endif
a.cpp
-
#include "a.h"
-
#include "d.h"
-
void A::SetC(C* c)
-
{
-
m_c = c;
-
}
-
C* A::GetC() const
-
{
-
return m_c;
-
}
-
void A::ModifyD(D* d)
-
{
-
d->SetX(0);
-
d->SetY(0);
-
m_d = d;
- }
File Inclusion Analysis
Lets analyze the header file inclusions, from the point of view of classes involved in this example, i.e. ABase, A, B, C and D.
Class ABase |
ABase is the base class, so the class declaration is required to complete the class declaration. The compiler needs to know the size of ABase to determine the total size of A. In this case abase.h should be included explicitly in a.h. |
Class B |
Class A contains Class B by value , so the class declaration is required to complete the class declaration. The compiler needs to know the size of B to determine the total size of A. In this case b.h should be included explicitly in a.h. |
Class C |
Class C is included only as a pointer reference. The size or actual content of C are not important to a.h or a.cpp. Thus only a forward declaration has been included in a.h. Notice that c.h has not been included in either a.h or a.cpp.
|
Class D |
Class D is just used as a pointer reference in a.h. Thus a forward declaration is sufficient. But a.cpp uses class D in substance so it explicitly includes d.h.
|
Key Points
The key points here are header files should be included only when a forward declaration will not do the job. By not including c.h and d.h other clients of class A never have to worry about c.h and d.h unless they use class C and D in substance.
Also note that a.h has been included as the first header file in a.cpp This will make sure that a.h does not expect a certain header files to be included before a.h. As a.h has been included as the first file, successful compilation of a.cpp will ensure that a.h does not expect any other header file to be includedbefore a.h. If this is followed for all classes, (i.e. x.cpp always includes x.h as the first header) there will be no dependency on header file inclusion.
Note that a.h includes the check on preprocessor definition of symbol _a_h_included_. This makes it tolerant to duplicate inclusions of a.h.
Cyclic Dependency
Cyclic dependency exists between class X and Y in the following example. This dependency is handled by using forward declarations.
x.h and y.h
-
/* ====== x.h ====== */
-
// Forward declaration of Y for cyclic dependency
-
class Y;
-
class X
-
{
-
Y *m_y;
-
...
-
};
-
/* ====== y.h ====== */
-
// Forward declaration of X for cyclic dependency
-
class X;
-
class Y
-
{
-
X *m_x;
-
...
- };
分享到:
相关推荐
When you include a header file you introduce a dependency that will cause your code to be recompiled whenever the header file changes. If your header file includes other header files, any change to ...
实训商业源码-单个商品销售系统源码-毕业设计.zip
内容概要:本文详细介绍了基于KEALC编程的变压器温度实时检测与报警系统的开发过程。系统采用51单片机为核心控制器,利用DS18B20传感器测量变压器顶层油温和绕组温度,并通过LCD显示屏实时显示温度值。当温度超过设定阈值时,系统将触发报警机制,包括点亮LED灯和启动蜂鸣器。若温度达到危险水平,则自动切断继电器进行保护。文中还讨论了Proteus仿真的具体步骤、Altium Designer (AD)绘制电路图的注意事项以及实际部署中的优化措施。此外,文章强调了温度阈值的可配置性和防误报的设计思路。 适合人群:具有一定电子电路和嵌入式系统基础知识的技术人员,特别是从事电力设备维护和自动化控制系统开发的专业人士。 使用场景及目标:适用于需要对变压器温度进行精确监控的应用场合,确保变压器安全稳定运行,预防因温度过高引发的安全事故。目标是提供一种高效可靠的温度监控解决方案,保障电力设备的长期可靠运行。 其他说明:文中提供的代码片段展示了关键的报警逻辑和温度采集算法,有助于读者理解和实现类似项目。同时,文中提到的实际部署经验和优化建议对于提高系统的稳定性和可靠性具有重要指导意义。
环境准备:Nacos 依赖 Java 环境运行,需确保安装了 64 位 JDK 1.8+。 解压安装包:在 Linux 系统中,使用命令 tar -zxvf nacos-server-2.2.2.tar.gz 解压到指定目录,如 /usr/local/nacos
Advanced RF Board Skills in ADS
你好你好是多少多少多少多少多少
内容概要:本文档主要描述了一个基于MATLAB的射线追踪实验流程。首先定义了射线追踪结果的输出文件名为'synthetic_rays.mat',并加载了必要的观测点几何数据和正向模型数据。接着设置了射线追踪的相关参数,包括标志位、步长以及最大追踪步数等。然后通过调用mFAST_raytracing函数执行射线追踪操作,获取计算时间、成功索引和射线轨迹等结果。最后将射线追踪结果保存为.mat文件,并将射线传播时间分别保存为.mat文件和文本文件。; 适合人群:具备一定MATLAB基础,从事地质勘探、地球物理等相关领域的科研人员或学生。; 使用场景及目标:①进行地下结构成像研究;②模拟地震波传播路径;③验证正向模型准确性。; 阅读建议:此文档详细记录了射线追踪实验的具体步骤,在阅读时应重点关注参数设置部分,并结合实际应用场景调整相关参数值,同时注意保存结果的不同格式以满足不同需求。
实训商业源码-城市生活服务分类手机页面模板-毕业设计.zip
内容概要:本文详细介绍了三菱FX5U PLC在四轴定位控制项目中的应用,涵盖了从参数设定到触摸屏程序整合的完整流程。首先,项目概述了使用三菱FX5U PLC作为核心控制器,负责四个轴的定位控制,并通过威纶通触摸屏实现人机交互。接下来,文章逐步讲解了公共参数设定、回原点功能、JOG手动控制、绝对和相对定位控制、多种控制模式(手动、自动、暂停)、IO表与电气选型清单、威纶通触摸屏程序开发以及电路图(EPLAN)绘制。每个环节都体现了PLC在工业自动化中的关键作用。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些需要深入了解PLC编程和四轴定位控制的人群。 使用场景及目标:适用于需要设计和实现四轴定位控制系统的工程项目,帮助工程师掌握PLC编程技巧,提高系统稳定性和精度。同时,也为实际项目提供了一个完整的参考模板。 其他说明:本文不仅提供了理论指导,还包括具体的实现细节和实例,有助于读者更好地理解和应用相关技术。
内容概要:本文详细介绍了蓝牙4.2技术的发展背景、主要性能提升及其广泛应用场景。蓝牙技术自1994年由爱立信公司启动探索,经历了多个版本的迭代升级。蓝牙4.2在2014年底发布,在数据传输速度、传输距离、功耗和安全性能四个方面实现了显著提升,最大传输速度达到2.5Mbps,传输距离扩展到50米,功耗进一步降低,并引入了AES-CCM算法和数字签名等安全功能。这些改进使得蓝牙4.2在智能穿戴设备、智能家居、物联网等多个领域得到广泛应用。此外,文章还对比了蓝牙4.2与蓝牙4.0、蓝牙5.0及更高版本的差异,指出了如何挑选合适的蓝牙4.2设备,并展望了其未来在智能家居、工业物联网、虚拟现实等领域的应用前景。; 适合人群:对无线通信技术感兴趣的科技爱好者、智能家居和物联网从业者、以及希望了解蓝牙技术发展历程和最新进展的普通用户。; 使用场景及目标:①了解蓝牙技术的历史和发展趋势;②掌握蓝牙4.2相较于其他版本的具体改进;③学习如何根据需求选择合适的蓝牙4.2设备;④探索蓝牙4.2在不同领域的应用潜力。; 其他说明:蓝牙4.2虽然在某些性能上不如后续版本,但在许多对性能要求适中的场景中仍具有重要地位。未来,蓝牙4.2将继续在智能家居、工业物联网等领域发挥重要作用,并随着技术进步不断拓展新的应用场景。
.1- 2025-5-09
内容概要:本文档详细介绍了STM32F407ZET6的GPIO(通用输入输出接口)。GPIO在输出模式下能控制端口输出高低电平,适用于驱动LED、控制蜂鸣器等;在输入模式下可读取端口的高低电平或电压,如读取按键输入、ADC电压采集等。每个通用I/O端口包含多个32位配置寄存器、数据寄存器等。文档列举了GPIO的八个功能模式,重点解析了输出状态中的推挽输出和开漏输出,以及输入状态中的下拉电阻和上拉电阻的概念与工作原理。推挽输出可输出高低电平,由两个互补的晶体管提供较大电流驱动;开漏输出通常只能输出低电平,适合电平转换。输入状态方面,下拉电阻将信号初始化为低电平,上拉电阻则初始化为高电平,其本质分别是输出和注入电流。; 适合人群:嵌入式系统开发人员、电子工程师、对STM32微控制器有兴趣的学习者。; 使用场景及目标:①帮助开发者理解STM32F407ZET6的GPIO工作机制;②为实际项目中GPIO的应用提供理论指导,如控制外部设备、读取传感器数据等。; 其他说明:文档提供了详尽的寄存器配置信息和功能模式介绍,有助于深入理解和灵活运用GPIO接口。建议读者结合实际硬件操作进行学习,以加深理解。
内容概要:本文全面介绍了PHP语言,涵盖从基础知识到项目实战的多个方面。首先概述了PHP的特点及其在Web开发领域的应用,接着详细讲解了环境搭建的方法,包括Web服务器、PHP安装和数据库配置。文档深入浅出地阐述了PHP的基础语法,如变量、数据类型、控制结构、函数和数组操作。通过用户登录系统和数据展示页面两个实战案例,展示了PHP在实际项目中的应用,涉及数据库交互、会话管理和页面渲染。进一步探讨了进阶项目的开发流程,强调了需求分析、技术选型、MVC模式的重要性,并介绍了部署与优化的技巧。最后,推荐了主流框架(如Laravel、Symfony)、开发工具以及学习资源,帮助读者提升PHP开发技能。 适合人群:初学者以及有一定编程经验、希望深入学习PHP的开发者。 使用场景及目标:①快速搭建PHP开发环境,掌握PHP基础语法;②通过实战案例理解PHP在Web开发中的具体应用;③学习项目开发流程,提高代码质量和开发效率;④了解PHP框架和工具,拓宽技术视野。 阅读建议:阅读时应结合实际操作练习,按照文档步骤搭建环境、编写代码,同时参考提供的学习资源,逐步深入理解PHP的各项特性。
智能车竞赛学习资料:机器人操作系统ROS原理与应用.pdf
实训商业源码-WordPress主题-图片摄影作品展示自适应主题-毕业设计.zip
叮咚活动报名高级版小程序V5.2.8 前端 版本号:5.2.8 – 普通版 备注:需要重新上传小程序 1、修复票券上地址显示错误问题 2、修复其他小的BUG
内容概要:本文详细介绍了威纶通MT6103IP触摸屏与两台台达VFD-M变频器通过Modbus RTU进行通讯的具体实现方法和操作步骤。首先讲解了硬件连接方式,强调了正确的接线对于确保通讯正常的重要性。接着阐述了通讯参数的设置,包括波特率、数据位、停止位以及校验方式的选择,并指出这些参数在所有设备间的一致性至关重要。随后提供了具体的编程实例,如读取运行频率和发送启动命令的关键代码片段,同时解释了Modbus地址到实际寄存器地址之间的转换规则。此外还讨论了一些常见的调试技巧,例如解决RS485信号衰减的方法,在触摸屏界面上添加通讯状态监测等功能,以及针对台达变频器特有的参数写入机制进行了说明。 适用人群:工业自动化领域的工程师和技术人员,特别是那些负责PLC编程、人机界面(HMI)开发以及现场设备维护工作的专业人士。 使用场景及目标:适用于希望深入了解并掌握如何将威纶通触摸屏与台达变频器集成在一起的应用场合。主要目的是帮助用户顺利完成两者间的通信配置,确保能够可靠地监控和控制变频器的工作状态。 其他说明:文中不仅包含了理论性的指导,还有大量实用的操作提示和经验分享,有助于提高工作效率,减少调试过程中可能出现的问题。
内容概要:本文详细介绍了基于MATLAB R2019a的两级式三相LCL并网逆变器谐振抑制策略的Simulink仿真研究。首先,文中描述了系统的整体架构,包括前级BOOST升压电路配合扰动观察法MPPT实现最大功率跟踪控制,以及后级三相桥式逆变器中LCL滤波器采用无源或有源阻尼的方法。接着,针对LCL滤波器容易出现的谐振问题,提出了双闭环控制策略,即电压外环和电流内环控制,确保直流侧电压稳定并实现单位功率因数控制。此外,还探讨了不同阻尼方式的效果,如无源阻尼导致约1.5%的效率损失,而有源阻尼则通过虚拟阻抗实现更好的性能。最后,通过PWM生成模块中的死区补偿进一步优化了系统性能,使得总谐波失真(THD)控制在1.5%以内,远低于国家标准。 适合人群:电力电子工程师、科研人员、高校师生等对并网逆变器及其谐振抑制策略感兴趣的群体。 使用场景及目标:适用于需要进行并网逆变器设计与仿真的场合,旨在解决LCL滤波器带来的谐振问题,提高并网质量,降低THD值,满足并网标准。 其他说明:文中提供了具体的MATLAB/Simulink代码片段和参数设置,有助于读者理解和复现实验结果。同时提醒实际硬件调试时还需考虑更多因素,如采样延时、开关管非线性等。
内容概要:本文详细介绍了利用COMSOL进行铌酸锂波导倍频(PPLN)仿真的方法和技术难点。首先讨论了材料设置中非线性系数d33的空间调制方式,推荐使用tanh函数代替sign函数以提高收敛性。接着阐述了波导结构的选择和模式分析的关键步骤,强调了正确设置边界条件的重要性。对于网格划分提出了在极化周期交界处局部加密的方法,并解释了分步求解策略以节省内存。最后,作者提醒注意相位匹配条件以及考虑实际器件制造中的工艺误差对转换效率的影响。 适合人群:从事非线性光学研究、光子学器件设计的研究人员和工程师。 使用场景及目标:帮助读者掌握COMSOL软件中针对PPLN结构的仿真技巧,优化仿真流程,提升仿真准确性,解决实际项目中可能遇到的问题。 阅读建议:由于文中涉及大量具体的操作细节和技术要点,建议读者结合自己的项目背景仔细研读每个部分的内容,并尝试将所学应用到实践中去。
内容概要:本文详细介绍了利用FLAC3D软件进行边坡地震响应模拟的方法。首先,明确了模型的目标和准备工作,包括设定边坡的几何形状和材料属性,并采用自由场边界条件以更好地模拟地震波的传播。接着,引入瑞利阻尼来模拟能量耗散,提高模拟的真实性。然后,通过输入阪神地震波和鲁甸波等实际地震数据,展示了不同地震波对边坡响应的影响。最后,进行了代码实现和简单分析,探讨了边坡在地震作用下的位移变化和应力分布,并进行了敏感性分析。 适合人群:从事地质工程、地震工程及相关领域的研究人员和工程师。 使用场景及目标:适用于需要深入了解边坡地震响应机制的研究项目,以及希望通过模拟优化边坡设计和提高抗震性能的实际工程项目。 其他说明:本文不仅提供了具体的建模步骤和代码实现,还强调了参数选择对模拟结果的重要影响,鼓励读者进行更多实验和探索。