Qt 类的前置声明和头文件包含

news/2024/5/10 12:04:28

1. 在头文件中引入另一个类经常有两种写法

        1)前置声明        2)头文件包含

#ifndef FRMCOUPLE2_H
#define FRMCOUPLE2_H#include <QWidget>    //头文件包含namespace Ui {
class frmcouple2;
}//前置声明:QPushButton frmchkeyboard
class QPushButton;
class frmchkeyboard;
class frmcouple2 : public QWidget
{Q_OBJECTpublic:explicit frmcouple2(QWidget *parent = nullptr);~frmcouple2();private:Ui::frmcouple2 *ui;QPushButton *btn_close_extend = nullptr ;QPushButton *btn_tx_ms = nullptr;frmchkeyboard *m_pFrmChKeyBoard = nullptr;
};#endif // FRMCOUPLE2_H

2. 区别

前置声明前置声明类会告诉编译器,这些类已经存在了,并且不需要知道这些类的完整定义可以对其使用指针或者引用不能定义该类的实例化对象; 

例如:

        当我们用 class QNetworkAccessManager;时,我们可以对其使用指针或者引用:
        QNetworkAccessManager *m_manager;
        我们不能QNetworkAccessManager m_manager;否则如下:

头文件包含则是将整个该头文件与使用到的地方关联起来,所以你可以知道该类的具体信息。可以对其使用指针或者引用也可以定义该类的实例化对象;

3. 前置声明的优势

        1)避免了头文件被其他文件多次包含,尤其是在头文件中包含头文件时,容易造成重复包含和产生包含顺序问题(最坏情况:当类A和类B互相调用时候产生死循环,并且增大了文件的体积;

        2)可以去除编译依赖,减少编译消耗的时间。

例如:如果使用#include “Name.h” 一旦Name的定义需要修改,Name.h也就会重新编译,导致所有用到Name.h的文件也需要重新编译,这样就造成了编译依赖,增加了编译的时间,在大型项目中,如果很多这样的地方的话,甚至可能极度增加编译时间。

4. 使用前置声明的时机

        当你在头文件中只用到一些类的指针(而非实现),那么就可以不包含这些类的头文件,而去使用类的前置声明。

使用方式:.h中以“前置声明”方式引入类;在.cpp中以#include方式引入类;

5. 两个类相互包含实例

// 错误案例// a.h
class A { }// b.h
class B { }// 如果想在类A中使用类B,在类B中使用类A,应该怎么办// a.h
#include "b.h"
class A
{B *b
}// b.h
#include "a.h"
class B 
{A *a
}// 上面的方法一定是编译失败的 ...
// 正确方法
// a.h
#include "a.h"
#include "b.h"
class A 
{B *b = new B();b.a = this;void hello() {};
}// b.h
class A;
class B
{A *a;
}// b.cpp
#include "b.h"
#include "a.h" // 只能在 b.cpp 里面 include a.h
B::B()
{a.hello();
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:颜色渐变)

设置组件的颜色渐变效果。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 linearGradient linearGradient(value: { angle?: number | string; direction?: GradientDirection; colors: Array; repea…

Java代码审计安全篇-常见Java SQL注入

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计&#xff0c;记录自己的学习过程&#xff0c;还希望…

【DPDK】基于dpdk实现用户态UDP网络协议栈

文章目录 一.背景及导言二.协议栈架构设计1. 数据包接收和发送引擎2. 协议解析3. 数据包处理逻辑 三.网络函数编写1.socket2.bind3.recvfrom4.sendto5.close 四.总结 一.背景及导言 在当今数字化的世界中&#xff0c;网络通信的高性能和低延迟对于许多应用至关重要。而用户态网…

视频怎么压缩?不影响视频画质的三个方法

在数字化时代&#xff0c;高清晰度和4K视频的广泛应用使得我们在制作、分享和传输视频时拥有了更多的可能性。然而&#xff0c;随之而来的问题就是庞大的视频文件大小&#xff0c;不仅占用存储空间&#xff0c;而且在上传、分享和传输过程中可能遇到一系列的困扰。 为了解决这…

ModuleNotFoundError: No module named ‘aitodpycocotools‘

具体不清楚&#xff0c;反正pip下载也下载不了&#xff0c;改为pycocotools后没问题了 解决 分析 是承接之前错误&#xff0c;为了解决keyerror问题&#xff0c;pip install -v -e .重新安装mmdet&#xff0c;导致的

LLM | GPT-NEOX论文详解

GPT-NEOX使用旋转位置编码。模型权重使用float16表示。最大序列长度为2048。 论文题目&#xff1a;2022.04.14_GPT-NeoX-20B: An Open-Source Autoregressive Language Model 论文地址&#xff1a;2204.06745.pdf (arxiv.org) 论文代码&#xff1a;EleutherAI/gpt-neox: An imp…