两头文件互引问题解决(前置声明)

问题:

想必正在基础阶段学习的朋友们都遇见过以下问题吧

widget.h

otherwidget.h

        如上问题是,我在widget.h中引用了otherwidget.h ,在ohterwidget中又引用了widget.h,两个头文件互相引用产生了报错

解决办法:

        那么我们该如何解决呢,就用到了前置声明

        看这样完美解决了两头文件互引的问题,对 Widget 类进行了前置声明,这意味着代码里知晓 Widget 类的存在,但并未包含其完整定义

        但是注意什么叫做未包含完整定义呢,指的是编译器仅知道某个类或类型的存在,但不了解其具体的实现细节,像类的成员变量、成员函数的具体实现等。

        在具体一点,以下代码大家都应该知道吧是显示widget窗口,不过因为otherwidget并未包含其完整定义所以导致,我不知道它来自于什么,我只知道他的类型是Widget *widget

this->widget->show();

升级:

 所以我们还需要进入我们的.cpp文件,再去加入#include "widget",就包含了器完整定义

otherwidget.cpp

这时又出现了新问题,嘶~不是会报错吗,怎么又能引用了,所以注意这是widget.cpp文件 ,那我们看下面的解释:

        在 otherwidget.h 中,使用了 class Widget; 进行前置声明,这仅仅让编译器知道 Widget 是一个类名,但不清楚该类的具体实现细节。如果在 OtherWidget 类的实现中需要访问 Widget 类的成员变量或者调用其成员函数,就必须包含 Widget 类的完整定义,也就是要包含 widget.h 头文件。

头文件和源文件的分工

头文件(.h ):主要用于声明类、函数、常量等,为其他文件提供接口。头文件通常会使用头文件保护机制(如 #ifndef#define#endif)来避免重复包含。

源文件(.cpp:负责实现头文件中声明的类和函数。在源文件里,会包含必要的头文件,以获取相关的声明信息,进而完成具体的实现。

所以C++是不是很神奇呢,当然我们需要两个窗口互相访问的时候不止可以用这种方法,还可以使用Qt的特征的信号和槽来实现……

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

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

相关文章

Python 异常处理完全指南

目录 一、异常处理基础1. 基本语法结构 二、常见异常类型1. 内置异常层次2. 常见异常示例 三、多重异常处理1. 合并捕获2. 分层处理 四、finally与else子句1. finally 应用场景2. else 使用技巧 五、自定义异常1. 创建异常类2. 异常继承体系 六、异常链与上下文1. raise from 语…

【Qt】Ubuntu22.04使用命令安装Qt5和Qt6

1、安装Qt5 注意:Ubuntu22.04已经没有 qt5-default ,因此不能一键安装啦 1)安装核心组件 sudo apt install qtbase5-dev qtchooser qt5-qmake qtcreator2)安装QtCreator sudo apt install qtcreator3)安装工具包、Qt Quick 开发的核心库(qtdeclarative5-dev) sudo a…

手撸一个 deepseek 数据库对话,打造一个企业智能通讯录(ollama + deepseek + langchain)

前言 由于 deepseek 等大语言模型数据时效性问题,无法跟上现实世界信息的动态变化,企业内部信息更是无法理解,为了将 deepseek 应用到企业内部,之前有写过通过联网搜索、上传文件、搭建知识等检索增强生成(RAG&#xf…

线段树SegmentTree

线段树当中的几个重要操作 1.PushUp 上推操作:由子节点算父节点的信息 p u s h u p push up pushup 操作的目的是为了维护父子节点之间的逻辑关系。当我们递归建树时,对于每一个节点我们都需要遍历一遍,并且电脑中的递归实际意义是先向底层…

SSH免密登录服务器方法

Window免密连接Linux系统 生成公匙 ssh-keygen -t rsa一路回车生成公钥 复制公匙,使用记事本打开复制全部内容 notepad C:\Users\DELL\.ssh\id_rsa.pub内容如"ssh-rsa AAAAB3NzaC1yc2EAAAA…" 远程登录服务器将内容写入~/.ssh/authorized_keys echo …

Go 1.24 新特性解析:泛型类型别名、弱指针与终结器改进

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…

MySQL 表 t1 建立联合索引 (a, b, c),在 where a < ? and b > ? and c < ? 中哪些索引生效

文章目录 联合索引 abc 均范围扫描时的索引生效情况无回表 表数据量非常少无回表 表数据量多有回表总结 联合索引 abc 均范围扫描时的索引生效情况 场景&#xff1a;表 t1 建立联合索引 (a, b, c)&#xff0c;在 where a < ? and b > ? and c < ? 中哪些索引生效…

海外营收占比近4成,泡泡玛特全球化战略迎收获期

3月26日&#xff0c;泡泡玛特国际集团发布2024全年财报。财报显示&#xff0c;2024年泡泡玛特实现营收130.4亿元&#xff08;人民币&#xff0c;下同&#xff09;&#xff0c;同比增长106.9%&#xff0c;经调整净利润34.0亿元&#xff0c;同比增长185.9%。中国内地营收79.7亿元…

ctf-web: 不统一的解析 + sql注入要求输入与输出相等 -- tpctf supersqli

# 从 django.shortcuts 模块导入 render 函数&#xff0c;用于渲染模板 from django.shortcuts import render # 从 django.db 模块导入 connection 对象&#xff0c;用于数据库连接 from django.db import connection# 此模块用于创建视图函数 # 从 django.http 模块导入 Http…

LLM推理加速框架有哪些

LLM推理加速框架有哪些 目录 LLM推理加速框架有哪些1. TensorRT简介简单使用示例2. Triton Inference Server简介简单使用示例3. SGLang简介简单使用示例4. vLLM简介简单使用示例1. TensorRT 简介 TensorRT 是 NVIDIA 推出的一个用于高性能深度学习推理的 SDK。它能够对训练好…

【深度学习与实战】2.1、线性回归模型与梯度下降法先导案例--最小二乘法(向量形式求解)

为了求解损失函数 对 的导数&#xff0c;并利用最小二乘法向量形式求解 的值&#xff0c;我们按照以下步骤进行&#xff1a; ‌1. 损失函数的含义‌ 这是‌线性回归‌的平方误差损失函数&#xff0c;目标是最小化预测值 与真实值 之间的差距。 ‌定义损失函数‌&#xf…

S7-1200对V90 PN进行位置控制的三种方法

S7-1200系列PLC通过PROFINET与V90 PN伺服驱动器搭配进行位置控制,实现的方法主要有以下三种: ? 方法一、在PLC中组态位置轴工艺对象,V90使用标准报文3,通过MC_Power、MC_MoveAbsolute等PLC Open标准程序块进行控制, 这种控制方式属于中央控制方式(位置控制在PLC中计算,驱…

爱普生FC-135晶振5G手机的极端温度性能守护者

在5G时代&#xff0c;智能手机不仅需要高速率与低延迟&#xff0c;更需在严寒、酷暑、振动等复杂环境中保持稳定运行。作为 5G 手机的核心时钟源&#xff0c;爱普生32.768kHz晶振FC-135凭借其宽温适应性、高精度稳定性与微型化设计&#xff0c;成为5G手机核心时钟源的理想选择&…

ROS--IMU数据包

IMU惯性测量单元 一&#xff1a;IMU二&#xff1a;ROS中三&#xff1a;IMU数据包三&#xff1a;总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一&#xff1a;IMU IMU&#xff08;Inertial Measurement Unit&#xff0c;惯性测量单元&#xff09…

数据文件误删除,OceanBase中如何重建受影响的节点

当不慎误删数据文件且当前没有现成的可替换节点时&#xff0c;在OceanBase中&#xff0c;不必急于采取极端措施&#xff0c;可以考虑运用 server_permanent_offline_time 参数&#xff0c;来重建受影响的节点。 原理&#xff1a; server_permanent_offline_time 是 OceanBase数…

Python:匹配多个字符,如何匹配开头

匹配字符0次或无数次(*)&#xff1a; import re resre.match([A-Z][a-z]*,Lihailu) print(res.group())#提取数据 输出结果可以全部输出 匹配字符至少一次()&#xff1a; import re resre.match([A-Za-z]python,apython) print(res.group())#提取数据(后边只写python会…

Unity-RectTransform设置UI width

不知道有没人需要这样的代码&#xff0c;就是.sizeDelta //不确定是不是英文翻译的原因&#xff0c;基本很难理解&#xff0c;sizeDeltaSize&#xff0c;//未必完全正确&#xff0c;但这么写好像总没错过 //image 在一个UnityEngine.UI.Image 的数组内foreach (var image in l…

java学习——函数式编程(1)

函数式编程 Java 的函数式编程是一种以函数为核心构建逻辑的编程范式,强调不可变性、声明式代码和无副作用的操作。它通过Lambda表达式、函数式接口(如Function、Predicate、Consumer等)和Stream API等特性实现,将计算过程抽象为函数的组合与转换,而非传统的命令式步骤。…

AP CSA FRQ Q2 Past Paper 五年真题汇总 2023-2019

Author(wechat): bigshuang2020 ap csa tutor, providing 1-on-1 tutoring. 国际教育计算机老师, 擅长答疑讲解&#xff0c;带学生实践学习。 热爱创作&#xff0c;作品&#xff1a;ap csa原创双语教案&#xff0c;真题梳理汇总&#xff0c; AP CSA FRQ专题冲刺, AP CSA MCQ小题…

线程池详解:在SpringBoot中的最佳实践

线程池详解&#xff1a;在SpringBoot中的最佳实践 引言 在Java并发编程中&#xff0c;线程池是一种非常重要的资源管理工具&#xff0c;它允许我们在应用程序中有效地管理和重用线程&#xff0c;从而提高性能并降低资源消耗。特别是在SpringBoot等企业级应用中&#xff0c;正…