头文件相互包含 前向声明

目录

ClassA.h

 ClassA.cpp

ClassB.h

ClassB.cpp


error: C2143: 语法错误: 缺少“;”(在“*”的前面)

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

假设我们有两个类: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文件),我们包含了对方的头文件。这样,我们就可以避免循环包含问题,同时又能保持类之间的依赖关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/9650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ffmpeg常用的命令(windows)

ffmpeg -i visit.mp4 查看信息 ffmpeg -i visit.mp4 -hide_banner 去掉无关的信息&#xff0c;只保留目标文件的信息 ffmpeg -i visit.mp4 visit.avi 转换文件信息 ffmpeg -i visit.mp4 -qscale 0 visit.avi 保留原始的视频质量输出 ffmpeg -i visit.mp4 …

latex编译参考文献是问号解决办法

一、背景 使用Latex写文章时&#xff0c;编译tex文件后&#xff0c;正文中参考文献会变为&#xff1f;号&#xff0c;具体解决办法如下。 二、latex编译参考文献是问号解决办法 找到tex源文件所在的文件夹&#xff0c;删除所有除tex文件同名的文件&#xff0c;重新编译即可&…

cookie,session,token

目的&#xff1a;解决用户登录状态 从一个简单的登录开始说起&#xff0c; 在我们访问bilibili的时候&#xff0c;第一次需要登录&#xff0c;但后续就不需要登录了&#xff0c;可以直接访问bilibili。 而且每次在页面请求服务器的资源都需要维持登录状态&#xff0c;如果没…

电商核心技术揭秘51:多渠道营销整合策略

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 电商技术揭秘四十一&#xff1a;电商平台的营销系统浅析 电商技术揭秘四十二&#…

支付宝——图技术在金融反欺诈中的应用

目录 图在金融反欺诈中的应用背景 图驱动的感知研判决策处置 图在金融反欺诈中的演进 总结和展望

MySQL利用变量进行查询操作

在MySQL中&#xff0c;可以使用变量来存储查询结果&#xff0c;以便在随后的查询中使用。以下是一个示例&#xff0c;展示了如何使用变量进行查询操作&#xff1a; 创建一个示例表&#xff1a; CREATE TABLE example_table (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(…

OpenCV入门1:Python基础编程

目录 环境配置 Python基础语法 import 与 from...import If ... Else 语句 While 循环 For 循环 集合数据类型 列表 函数 类和对象 环境配置 详情请参考&#xff1a;Pycharm环境配置完整教程 Python基础语法 import 与 from...import 在 python 用 import 或者 f…

视频号音乐怎么下载

音乐&#xff0c;那个能够触动灵魂的艺术形式&#xff0c;穿越屏幕&#xff0c;流淌在视频号的每一个角落。然而&#xff0c;有时候&#xff0c;我们更希望能将那些动人心弦的旋律保存下来&#xff0c;让它们成为我们日常生活的一部分&#xff0c;陪伴我们度过每一个动人瞬间。…

DRM/RESP无法连接linux上redis的原因

问题一&#xff1a; redis.conf配置文件 进入到自己的redis软件目录 vim redis.conf 将bind 127.0.0.1 : 1 注释掉&#xff0c;改成bind 0.0.0.0&#xff0c;让远程所有ip都可以访问 将daemonize yes 守护进程&#xff0c;修改后可在后台运行 protected-mod…

NM2-WRDUW施耐德电动机保护器EOCR-NM2

EOCR智能电动机保护器原产地为韩国&#xff0c;隶属于施耐德(韩国)电气有限公司工厂。此公司早起源于韩国三和SAMWHA株式会社&#xff0c;是早研发电子式电动机保护器厂家&#xff0c;产品涵盖过电流继电器EOCR-SS,EOCR-SE2,EOCR-AR&#xff0c;欠电流继电器EUCR&#xff0c;数…

Spring AOP(2)

目录 Spring AOP详解 PointCut 切面优先级Order 切点表达式 execution表达式 切点表达式示例 annotation 自定义注解MyAspect 切面类 添加自定义注解 Spring AOP详解 PointCut 上面代码存在一个问题, 就是对于excution(* com.example.demo.controller.*.*(..))的大量重…

控制情绪是交易成功的根本?大错特错

布雷特斯坦伯格&#xff08;Brett Steenbarger&#xff09;是一位在美国享有盛誉的交易心理学专家&#xff0c;他曾在华尔街的多个顶尖培训中心担任交易员的心理指导。身为心理学教授兼高级交易员的布雷特在交易心理方面要比别人了解得多。而且小编觉得做一个成功的交易员只靠交…

笔试强训Day15 二分 图论

平方数 题目链接&#xff1a;平方数 (nowcoder.com) 思路&#xff1a;水题直接过。 AC code&#xff1a; #include<iostream> #include<cmath> using namespace std; int main() {long long int n; cin >> n;long long int a sqrtl(n);long long int b …

欢乐钓鱼大师游戏攻略,自动钓鱼!

在《欢乐钓鱼大师》的游戏中&#xff0c;每个玩家都沉浸在湖水的世界里&#xff0c;手持钓竿&#xff0c;期待着每次的收获。这不仅是一场简单的游戏&#xff0c;更是一次对技巧和耐心的考验。在这个充满乐趣和挑战的世界中&#xff0c;掌握正确的钓鱼技巧和选择合适的装备至关…

电子版图书制作,一键转换可仿真翻页的画册

在数字化浪潮的冲击下&#xff0c;传统纸质图书逐渐被电子版图书取而代之。电子版图书以其便携、环保、更新快速等特点&#xff0c;吸引了越来越多的读者。制作一款既具备电子图书的便捷性&#xff0c;又能仿真翻页的画册&#xff0c;成为当下图书出版行业的新趋势 1.要制作电子…

【QT教程】QT6模型-视图编程 QT模型视图编程

QT6模型-视图编程 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免…

数据结构与算法学习笔记九-二叉树的链式存储表示法和实现(C语言)

目录 前言 1.二叉树的链式存储 2.二叉链表的表示和实现 1.定义 2.创建 4.中序遍历二叉树 5.后序遍历二叉树 6.后序遍历二叉树 7.完整代码 前言 这篇博客主要介绍二叉树的链式存储结构。 1.二叉树的链式存储 上篇文章中介绍了二叉树的顺序存储结构&#xff0c;在最坏的…

ORACLE RAC ASM磁盘组OFFLINE后的处理步骤

近期某客户的备机数据库集群ASM磁盘出现问题&#xff0c;数据库系统异常关闭。对问题进行排查&#xff0c;可以发现问题是存储磁盘出现了IO问题后OFFLINE&#xff0c;从而导致磁盘组也OFFLINE。由于系统是备机&#xff0c;发现时已经过去了较长时间&#xff0c;多余NORMAL冗余&…

【核武器】2024 年美国核武器-20240507

2024年5月7日,《原子科学家公报》发布了最新版的2024美国核武器手册 Hans M. Kristensen, Matt Korda, Eliana Johns, and Mackenzie Knight, United States nuclear weapons, 2024, Bulletin of the Atomic Scientists, 80:3, 182-208, DOI: https://doi.org/10.1080/00963…

有Python 2和3,但只给Python 2安装模块

系统中同时安装了Python 2和Python 3&#xff0c;并且你想要为Python 2的pip安装pytz&#xff0c;你需要确保使用Python 2的pip版本来执行安装命令。通常&#xff0c;Python 2的pip可以通过pip2命令来调用。以下是详细步骤&#xff1a; 首先&#xff0c;你需要确认系统中安装了…