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

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_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.lryc.cn/news/312998.html

相关文章:

  • Qt+FFmpeg+opengl从零制作视频播放器-1.项目介绍
  • Learn OpenGL 01
  • Java开发从入门到精通(一):Java的基础语法进阶
  • 【C++从0到王者】第五十一站:B+树
  • Spring Cloud 面试题及答案整理,最新面试题
  • 使用Kali搭建钓鱼网站教程
  • 《TCP/IP详解 卷一》第15章 TCP数据流与窗口管理
  • ContentType类型总结
  • 基于脚手架创建vue工程
  • 【Http】OSI 和 TCP/IP,OSI,TCP/IP为什么网络要分层?
  • STM32(5) GPIO(2)输出
  • shell脚本一键部署docker
  • vue2实现拖拽排序效果
  • 数据结构实验:二叉排序树
  • Java类加载流程?
  • Docker从0到1的开始【入门篇】
  • @ResponseStatus
  • 高效加载大文件(pandas+dask)
  • 游戏引擎分层简介
  • 向爬虫而生---Redis 探究篇6<Redis的Bigkey问题介绍>
  • 【开源物联网平台】FastBee认证方式和MQTT主题设计
  • Ubuntu Qt控制终端运行ros
  • mysql 性能调优参数配置文件
  • windows右键新建文件没有txt文本文档怎么办?
  • 已读不回,我又玻璃心了
  • 面试经典150题(105-107)
  • javaWebssh药品进销存信息管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计
  • 计算机设计大赛 深度学习实现语义分割算法系统 - 机器视觉
  • Linux系统编程(六)高级IO
  • Python与FPGA——全局二值化