当前位置: 首页 > news >正文

头文件相互包含 前向声明

当两个类需要相互访问对方的成员或方法时,通常意味着它们之间存在某种依赖关系。这种依赖关系可能源于类的设计或功能需求。以下是一个简单的例子,展示了当两个类需要相互访问对方成员或方法时,如何使用包含对方头文件的方式来解决循环包含的问题。

假设我们有两个类:ClassA 和 ClassBClassA 有一个成员变量 bPtr,它是 ClassB 的指针,并且 ClassA 有一个成员函数 doSomethingWithB(),该函数需要访问 ClassB 的某个成员或方法。同时,ClassB 也有一个成员变量 aPtr,它是 ClassA 的指针,并且 ClassB 有一个成员函数 doSomethingWithA(),该函数需要访问 ClassA 的某个成员或方法。

ClassA.h

#ifndef CLASSA_H
#define CLASSA_H
#include <iostream>
using namespace std;
// 前向声明 ClassB,因为 ClassA 只需要一个指向 ClassB 的指针
class ClassB;class ClassA {
public:ClassA();~ClassA();// 成员函数需要访问 ClassB 的成员或方法,因此需要包含 ClassB.hvoid doSomethingWithB();void funA();// 指向 ClassB 的指针ClassB* bPtr;
};// 注意:由于 doSomethingWithB() 需要访问 ClassB 的成员,我们将在 ClassA.cpp 中包含 ClassB.h
#endif // CLASSA_H

 ClassA.cpp

#include "ClassA.h"
#include "ClassB.h" // 包含 ClassB.h 以使用 ClassB 的成员或方法ClassA::ClassA() {// 初始化代码...
}ClassA::~ClassA() {// 清理代码...
}void ClassA::doSomethingWithB() {// 假设 ClassB 有一个名为 methodOfB() 的成员函数bPtr->funB(); // 访问 ClassB 的成员或方法
}void ClassA::funA()
{cout<<"ClassA::funA()"<<endl;
}

ClassB.h

#ifndef CLASSB_H
#define CLASSB_H
#include <iostream>
using namespace std;
// 前向声明 ClassA,因为 ClassB 只需要一个指向 ClassA 的指针
class ClassA;class ClassB {
public:ClassB();~ClassB();// 成员函数需要访问 ClassA 的成员或方法,因此需要包含 ClassA.hvoid doSomethingWithA();void funB();// 指向 ClassA 的指针ClassA* aPtr;
};// 注意:由于 doSomethingWithA() 需要访问 ClassA 的成员,我们将在 ClassB.cpp 中包含 ClassA.h
#endif // CLASSB_H

ClassB.cpp

#include "ClassB.h"
#include "ClassA.h" // 包含 ClassA.h 以使用 ClassA 的成员或方法ClassB::ClassB() {// 初始化代码...
}ClassB::~ClassB() {// 清理代码...
}void ClassB::doSomethingWithA() {// 假设 ClassA 有一个名为 methodOfA() 的成员函数aPtr->funA(); // 访问 ClassA 的成员或方法
}void ClassB::funB()
{cout<<"ClassB::funB()"<<endl;
}

在这个例子中,我们使用了前向声明来告诉编译器ClassAClassB的存在,但在需要访问对方成员或方法的实现文件中(.cpp文件),我们包含了对方的头文件。这样,我们就可以避免循环包含问题,同时又能保持类之间的依赖关系。

相关文章:

头文件相互包含 前向声明

当两个类需要相互访问对方的成员或方法时&#xff0c;通常意味着它们之间存在某种依赖关系。这种依赖关系可能源于类的设计或功能需求。以下是一个简单的例子&#xff0c;展示了当两个类需要相互访问对方成员或方法时&#xff0c;如何使用包含对方头文件的方式来解决循环包含的…...

七款好用的上网行为管理软件推荐 |有没有好用的上网行为管理系统

七款好用的上网行为管理软件推荐 |有没有好用的上网行为管理系统 员工上班刷视频&#xff01; 员工上班炒股&#xff01; 员工上班干副业&#xff01; 碰见这种情况怎么办&#xff1f;当然是用电脑监控软件来监视员工的一举一动了&#xff0c;那么这样的软件有哪些呢&#…...

centos7-bcc 安装

检查 内核信息 确保安装的kernel-dev 和内核版本一致!!! rpm -qa|grep kernel kernel-tools-3.10.0-1160.92.1.el7.x86_64 kernel-devel-3.10.0-1160.92.1.el7.x86_64 kernel-headers-3.10.0-1160.92.1.el7.x86_64 kernel-3.10.0-1160.92.1.el7.x86_64 kernel-tools-libs-3.1…...

5.06号模拟前端面试8问

5.06号模拟前端面试8问 1.promise如何实现then处理 在JavaScript中&#xff0c;Promise 是一个代表异步操作最终完成或失败的对象。它有三种状态&#xff1a;pending&#xff08;等待&#xff09;&#xff0c;fulfilled&#xff08;完成&#xff09;&#xff0c;rejected&…...

解读Inscode AI:开启代码智能化的新时代

导语&#xff1a; 近年来&#xff0c;人工智能技术的迅猛发展已经深刻地影响着各个行业&#xff0c;而在软件开发领域&#xff0c;Inscode AI的出现无疑将给代码智能化带来一场革命。本文将为大家解读Inscode AI的特点和应用&#xff0c;探索其如何改变我们的软件开发方式。 一…...

快速了解Vuex

Vuex Vuex使用Vuex Vuex &#x1f4cc;vuex 是一个专为 Vue.js 应用程序开发的状态管理库 &#x1f4cc;vuex 可以在多个组件之间共享数据&#xff0c;并且共享的数据是响应式的&#xff0c;即数据的变更能及时渲染到模板 &#x1f4cc;vuex 采用集中式存储管理所有组件的状态…...

vue管理系统导航中添加新的iconfont的图标

1.在官网上将需要的图标&#xff0c;加入项目中&#xff0c;下载 2.下载的压缩包中&#xff0c;可以选择这两个&#xff0c;复制到项目目录中 3.如果和之前的iconfont有重复&#xff0c;那么就重新命名 4.将这里的.ttf文件&#xff0c;也重命名为自己的 5.在main文件中导入 6.在…...

Docker的介绍及与传统虚拟化技术的区别

Docker是一个开源的应用容器引擎&#xff0c;它使得开发者可以将应用及其依赖包打包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux或Windows操作系统的机器上。Docker基于Go语言开发&#xff0c;它的出现极大地简化了应用程序的部署、管理和扩展。 以下是Docker…...

06.Git远程仓库

Git远程仓库 #仓库种类&#xff0c;举例说明 github gitlab gitee #以这个仓库为例子操作登录码云 https://gitee.com/projects/new 创建仓库 选择ssh方式 需要配置ssh公钥 在系统上获取公钥输入命令&#xff1a;ssh-keygen 查看文件&#xff0c;复制公钥信息内…...

Anaconda安装和深度学习环境的安装(TensorFlow、Pytorch)

换了新电脑&#xff0c;重新装一下anaconda这些编程环境。好久没装过了&#xff0c;自己也需要查查资料&#xff0c;然后记录一下&#xff0c;分享给别人。 目标&#xff0c;三个环境&#xff1a;1.anaconda基础环境&#xff08;包含xgboost和lightgbm&#xff09;&#xff0c…...

元素设置 flex:1,但是会被内部长单词宽度超出拉伸

初始布局如上图&#xff0c;left中是代码编辑器&#xff0c;实际上是个文本域&#xff0c;当输入长文本过长时&#xff0c;left宽度会被拉伸。 右侧容器被挤压。 解决方案&#xff1a;width&#xff1a;0&#xff1b; .left{flex:1; width:0} 当输入长文本过长时&#xff0c…...

win11 安装oracle11g详细流程及问题总结

1.安装包下载地址 本案例操作系统&#xff0c; Oracle 11g下载-Oracle 11g 64位/32位下载官方版(附详细的安装图解教程) - 多多软件站多多为大家免费提供Oracle 11g下载&#xff0c;包含64位/32位官方版本&#xff0c;并附详细的Oracle 11g安装图解教程&#xff0c;同时希望能…...

自我模拟面试

在面试中&#xff0c;你如何面对面试官呢&#xff1f; 我认为&#xff0c;对于面试官提出的问题&#xff0c;如果你不会&#xff0c;那就是不会。你的思考过程&#xff0c;实际上就是将你平时所学的&#xff0c;所了解的&#xff0c;在脑海中进行一次复习&#xff0c;就像当别…...

头歌java面向对象基础

第一关类的定义 package step1;// ---------------------Begin------------------------ public class Student{String name"李四";int age18;public void speak(){System.out.println("我爱学习");} }// ---------------------End----------------------…...

PMP课程知识点很多,无法入手,该如何学习?

回顾整个学习过程&#xff0c;我花费了不少时间&#xff0c;但也学到了系统的项目管理知识&#xff0c;考试结果也让我感到满意。在学习过程中&#xff0c;我认为以下几点非常重要&#xff1a; 1、需要对课本进行整体阅读&#xff0c;以便对内容有一个整体印象&#xff1b; 2…...

隔离流量优化网络传输

不要将长流和短突发流(或者大象流和老鼠流)混部在一起&#xff0c;我建议用切片或虚通道将它们在全链路范围彻底隔离&#xff0c;而不仅仅在交换机上配合着大肆宣讲的高端包分类算法配置一些排队调度。 也不必扯泊松到达&#xff0c;帕累托分布&#xff0c;这些概念在论文建模…...

【前端热门框架【vue框架】】——事件处理与表单输入绑定以及学习技巧,让学习如此简单

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;程序员-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…...

芒果YOLOv8改进164:检测头篇:ImplicitHead 隐性知识检测头| 即插即用,独家新颖更新,精度高效涨点

💡本篇内容:芒果YOLOv8改进164:检测头篇:ImplicitHead 独家原创检测头 | 即插即用,独家新颖更新,精度高效涨点 芒果专栏提出:原创隐性知识学习检测头 ImplicitHead 结构,改进源码教程 | 详情如下🥇 即插即用 ImplicitHead检测头,包括改进所需的 核心结构代码 文件作…...

学习周报:文献阅读+Fluent案例+有限体积法理论学习

目录 摘要 Abstract 文献阅读&#xff1a;使用带有域分解的PINN求解NS方程 文献摘要 文献讨论|结论 实验设置 NS方程介绍 PINN框架 损失函数 域分解 减轻梯度病理的方法 动态权重方法 新型网络架构 案例证明&#xff1a;2D圆柱尾流 Fluent案例&#xff1a;径向流…...

用户中心(下)

文章目录 计划登录逻辑接口简单说明cookie和session写代码流程后端逻辑层控制层测试用户管理接口 前端简化代码对接后端代理 计划 开发完成后端登录功能 &#xff08;单机登录 > 后续改造为分布式 / 第三方登录&#xff09;✔开发后端用户的管理接口 &#xff08;用户的查询…...

机器学习在芯片电容提取中的应用与挑战

1. 电容提取的技术挑战与机器学习机遇在芯片设计流程中&#xff0c;电容提取是决定最终产品性能的关键环节。当设计进入物理实现阶段&#xff0c;工程师需要精确计算互连结构中导体间的寄生电容&#xff0c;这些数据直接影响时序收敛和功耗分析。传统基于数值求解器的方法&…...

从RNN的“失忆症”到LSTM的“记忆宫殿”:图解三个门控单元如何拯救梯度消失

从RNN的"失忆症"到LSTM的"记忆宫殿"&#xff1a;图解三个门控单元如何拯救梯度消失 想象一下&#xff0c;你正在阅读一本精彩的小说&#xff0c;但每翻过一页就会忘记前一页的大部分内容——这就是标准RNN神经网络面临的困境。在自然语言处理和时间序列分析…...

LeetCode 1665.完成所有任务的最少初始能量:排序(贪心)

【LetMeFly】1665.完成所有任务的最少初始能量&#xff1a;排序(贪心) 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-initial-energy-to-finish-tasks/ 给你一个任务数组 tasks &#xff0c;其中 tasks[i] [actuali, minimumi] &#xff1a; actuali 是完…...

Azure Quickstart Templates 多区域部署高可用架构设计终极指南:5步构建企业级灾难恢复方案

Azure Quickstart Templates 多区域部署高可用架构设计终极指南&#xff1a;5步构建企业级灾难恢复方案 【免费下载链接】azure-quickstart-templates Azure Quickstart Templates 项目地址: https://gitcode.com/gh_mirrors/az/azure-quickstart-templates 在当今数字化…...

终极指南:3分钟解决Windows安装iPhone网络共享驱动难题

终极指南&#xff1a;3分钟解决Windows安装iPhone网络共享驱动难题 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_mi…...

ARM HCR_EL2寄存器解析与虚拟化控制

1. ARM HCR_EL2寄存器架构解析HCR_EL2&#xff08;Hypervisor Configuration Register&#xff09;是ARMv8/v9架构中用于控制虚拟化行为的关键系统寄存器。作为Hypervisor的主要控制接口&#xff0c;它定义了EL2对低特权级&#xff08;EL1/EL0&#xff09;执行环境的监控策略。…...

MCP密钥安全管理的无侵入解决方案:mcp-safe-run工具详解

1. 项目概述&#xff1a;告别硬编码&#xff0c;拥抱安全的MCP密钥管理如果你和我一样&#xff0c;日常开发中深度依赖Claude、Cursor、Windsurf这类智能编码助手&#xff0c;那你肯定对Model Context Protocol&#xff08;MCP&#xff09;不陌生。MCP作为连接AI模型与外部工具…...

Nature论文检索正在失效,Perplexity底层检索逻辑重构预警(仅限科研骨干内部流通的3条技术简报)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Nature论文检索正在失效&#xff0c;Perplexity底层检索逻辑重构预警&#xff08;仅限科研骨干内部流通的3条技术简报&#xff09; 检索信号衰减的实证观测 近期对Nature、Science主站及PubMed Centra…...

Faust.js实战:用Next.js构建高性能Headless WordPress前端

1. 项目概述&#xff1a;当WordPress遇见现代前端如果你和我一样&#xff0c;在过去几年里深度参与过企业级WordPress项目&#xff0c;那你一定对那个经典的“两难困境”记忆犹新&#xff1a;一方面&#xff0c;WordPress的后台管理体验和内容生态无可匹敌&#xff0c;是内容团…...

边缘计算中的机器学习能效优化与混合架构实践

1. 边缘计算中的机器学习能效革命在智能手表、健康监测设备等穿戴式设备中&#xff0c;实时运行机器学习模型一直是个棘手的问题。传统方案要么耗电太快导致续航崩溃&#xff0c;要么精度太低失去实用价值。我们团队最近实验的一组数据很能说明问题&#xff1a;在常见的运动识别…...