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

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_OBJECT

public:
    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. 使用前置声明的时机

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

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();
}

 

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

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

相关文章

QT----云服务器部署Mysql,Navicat连接1698 -Access denied for user ‘root‘@‘‘

阿里云有活动&#xff0c;白嫖了一年的新加坡轻量级服务器&#xff0c;有点卡&#xff0c;有时候要开梯子 白嫖300元优惠券 目录 1 安装启动Mysql服务2 更改连接权限2.1 Navicat连接报错1698 -Access denied for user root 3 qt连接云服务器数据库 1 安装启动Mysql服务 我使用…

Go-zero中分布式事务的实现(DTM分布式事务管理器,在一个APi中如何调用两个不同服务的rpc层,并保证两个不同服务之间的业务逻辑同时成功)

涉及到的相关技术 1.DTM分布式事务管理器,解决跨数据库、跨服务、跨语言栈更新数据的一致性问题。 2.SAGA事务模式,SAGA事务模式是DTM中常用的一种模式,简单易上手.(当然还有其它更多的事务模式,这里采用的SAGA只不过是其中一种较为简单的方法) 3.Go-zero框架,ETCD服务注册... …

虾皮、lazada店铺运营攻略,如何搭建高效、稳定的自养号测评系统

随着电子商务的蓬勃发展&#xff0c;越来越多的人选择在虾皮这样的电商平台上开设店铺&#xff0c;以实现创业梦想。但如何在众多店铺中脱颖而出&#xff0c;成为消费者的首选?本文将为您详细解答“怎么样做好虾皮店铺”&#xff0c;并提供一些实用的运营建议。 一、怎么样做…

Java工作需求后端代码--实现树形结构

加油&#xff0c;新时代打工人&#xff01; 前端页面 带树形结构的表格 最近在新项目上加班加点&#xff0c;下面是个实现树形结构的数据表格。 需求&#xff1a; 在前端页面表格中展示成树形结构的数据。 技术&#xff1a; 后端&#xff1a;Java、Mybatis-Plus、HuTool树形的…

b站小土堆pytorch学习记录—— P18-P22 神经网络+小实战

文章目录 一、卷积层 P181.卷积操作2.代码 二、池化层 P191.池化层简单介绍2.代码&#xff08;1&#xff09;池化操作中数字的变化&#xff08;2&#xff09;池化操作对图片的影响 三、非线性激活 P201.简要介绍2.代码 四、线性层及其他层介绍 P211.线性层2.代码 五、搭建小实战…

docker安装和使用kafka

1. 启动zookeeper Kafka依赖zookeeper, 首先安装zookeeper -p&#xff1a;设置映射端口&#xff08;默认2181&#xff09; docker run --name zookeeper \--network app-tier \-e ALLOW_ANONYMOUS_LOGINyes \--restartalways \-d bitnami/zookeeper:latest2. 启动kafka docker…

实验七 综合实验

一&#xff0e; 下载并成功运行Anaconda,jupyter book ,spyder 输入检验(print (“hello”)) 二&#xff0e; 在jupyter prompt中安装库&#xff1a; 找到anaconda 的Scripts库&#xff0c;并复制路径以备后面安装命令 D:\Program Files\anaconda3\Scripts 进入prompt命令…

网络原理初识

一、IP地址 概念 IP 地址主要用于标识网络主机、其他网络设备&#xff08;如路由器&#xff09;的网络地址。简单说&#xff0c; IP 地址用于定位主机 的网络地址 。 就像我们发送快递一样&#xff0c;需要知道对方的收货地址&#xff0c;快递员才能将包裹送到目的地。 二、…

搭建的svn 1.14.1,拉取代码时候没输入账户密码就报错 auth failed

这边在ubuntu里面搭的svn server&#xff0c;但是拉代码的是否一直报错 auth faield&#xff0c;一开始以为是有auth cache&#xff0c;去设置里面清楚了&#xff0c;windows 里面也清楚了&#xff0c;但是还是报错 问题原因 一直排查才发现&#xff0c;我新增用户的时候&…

vue+uniapp实现图形验证码功能-插件(附源码)

一、需求背景 vueuniapp实现图形验证码功能-插件&#xff08;附源码&#xff09; 在登录系统时&#xff0c;除了密码登录&#xff0c;还需要提供验证码登录。 涉及验证码&#xff0c;为了安全&#xff0c;一般会加入图形验证码&#xff0c;然后再发短信验证码。 如图&#xff1…

为国产信创服务器提供LDAP统一身份认证方案

金融信创作为 8 大行业信创之首&#xff0c;早已成为其他行业信创建设的参考。金融行业有着极为复杂的业务场景&#xff0c;对系统有着极高的稳定可靠需求&#xff0c;因此&#xff0c;在寻找微软 AD 国产化替代方案时&#xff0c;常会涉及到更深层次的场景。例如&#xff0c;最…

计算机大数据毕业设计-基于Flask的旅游推荐可视化系统的设计与实现

基于Flask的旅游推荐可视化系统的设计与实现 编程语言&#xff1a;Python3.10 涉及技术&#xff1a;FlaskMySQL8.0Echarts 开发工具&#xff1a;PyCharm 摘要&#xff1a;以Pycharm为旅游推荐系统开发工具&#xff0c;采用B/S结构&#xff0c;使用Python语言开发旅游景点推…

电网数字孪生的开发框架

电网数字孪生的开发框架通常会综合利用多种技术和工具&#xff0c;包括数据处理、模型建立、仿真与优化等方面的工具和平台。以下是一些常用的开发框架&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。…

网络安全: Kali Linux 进行 SSH 渗透与防御

目录 一、实验 1.环境 2.nmap扫描目标主机 3.Kali Linux 进行 SSH 渗透 3.Kali Linux 进行 SSH 防御 二、问题 1.SSH有哪些安全配置 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统版本IP备注Kali Linux2022.4 192.168.204.154&#xff08;动态&…

【JavaScript 漫游】【031】window 对象总结

文章简介 本篇文章为【JavaScript 漫游】专栏的第 030 篇文章&#xff0c;记录了浏览器模型中 window 对象的相关知识点。 window 对象概述 浏览器里面&#xff0c;window 对象&#xff08;注意&#xff0c;w 为小写&#xff09;指当前的浏览器窗口。它也是当前页面的顶层对…

Java中线程操作的相关方法

当涉及到在Java中操作线程时&#xff0c;有许多内置的类和方法可供使用。下面是关于Java中线程操作的主要方法和技术的简要教程&#xff1a; 1. 创建线程 在Java中&#xff0c;有两种主要的方式来创建线程&#xff1a; - 继承 Thread 类并重写其 run() 方法。 - 实现 Runna…

深入探讨javascript的流程控制与分支结构,以及js的函数

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;前端泛海 景天的主页&#xff1a;景天科技苑 文章目录 1.流程控制与分支结构1.if分支结构2.switch case 分支结构3.循环结…

C++消息队列处理提高性能的方法

1 消息队列特点 在当前多数软件系统中,处理传递消息多用消息队列机制,他具有以下优点: 1. 异步通信:消息队列支持异步通信,发送者和接收者之间的解耦程度较高。发送者将消息放入队列后即可继续执行,而不需要等待接收者的响应。这样可以提高系统的吞吐量和处理能力。 2.…

删除指定的数

删除指定的数 题目描述&#xff1a;解法思路&#xff1a;解法代码&#xff1a;运行结果&#xff1a; 题目描述&#xff1a; 先输入10个整数存放在数组中&#xff0c;再输入⼀个整数n&#xff0c;删除数组中所有等于n的数字&#xff0c;数组中剩余的数组保证数组的最前面&#…

电脑键盘快捷键,掌握这些,快速提高效率!

“我是一名电脑新手&#xff0c;在使用电脑时还有很多不懂的。想问问大家平常有什么比较好用的电脑键盘快捷键可以推荐吗&#xff1f;” 在数字化时代&#xff0c;电脑已成为我们生活与工作中不可或缺的工具。掌握一些常用的电脑键盘快捷键&#xff0c;不仅能提高我们的工作效率…