[C++]前置声明和头文件

电拖笔记1电磁学基本知识与定律 电拖学习 阅读详情

看完《Effective C++》条款31有感。。

假设有一个Date类

Date.h

如果有个Task类的定义要用到Date类,有两种写法

其一

Task1.h

 

其二

Task2.h

一个采用前置声明,一个采用#include<Date.h>加入了Date的定义。两种方法都能通过编译。但是 Task1.h 这种写法更好。如果Date.h 的 private 成员变量改变,比如变成 double year, month, day; ,Task1.h 不需要重新编译,而 Task2.h 就要重新编译,更糟的是如果 Task2.h 还与其他很多头文件有依赖关系,就会引发一连串的重新编译,花费极大的时间。可是事实上改变一下写法就可以省去很多功夫。

所以能用前置声明代替#include 的时候,尽量用前置声明

有些情况不能用前置声明代替#include

比如Task1.h改成


会编译错误,因为Date d定义了一个Date类型变量,编译器为d分配内存空间的时候必须知道d的大小,必须包含定义Date类的Date.h文件。

这是可以采用指针来代替

指针的大小是固定的。在32位机上是4字节,64位机上是8字节。这时编译Task1的时候不需要Date的大小,所以和Date的定义无关。

何时可以用前置声明代替#include

(http://blog.youkuaiyun.com/rogeryi/archive/2006/12/12/1439597.aspx)

上述例子可以说明

如果使用object reference 或 object point 可以完成任务,就不要用object

这样可以尽最大可能避免#include


为声明式和定义是提供不同的头文件

在函数库的设计过程中,接口的设计就要遵循上述准则。

一个接口的头文件是这样的

interface.h

如果客户只用到Date类,编译器就只会去编译Date.h,而不去编译Address.h,Email.h 等等文件。


手把手教你学Simulink——基于Simulink的电压型 vs 电流型整流器性能对比 摘要:本文基于Simulink平台对比分析了电压型整流器(VSR)和电流型整流器(CSR)的性能差异。VSR采用电容滤波,具有高功率因数(PF>0.99)、低输入电流THD(<3%)等优势,但动态响应较慢;CSR采用电感滤波,动态响应快(<0.05s),但THD较高(5%~8%)。研究建立了统一测试平台,详细对比了两者在稳态性能、动态响应、效率等方面的差异,并给出了控制算法实现和参数优化建议。通过量化分析,为电力电子工程师提供了拓扑选型依据,可根据恒压/恒流需求选择最优方案,有效缩短开发周 阅读详情

相关推荐

akshare 布林通道策略

import datetime import pandas as pd import backtrader as bt import matplotlib.pyplot as plt from datetime import datetime import matplotlib import akshare as ak %matplotlib inline class Boll_strategy(bt.Strategy): #自定义参数,每次买入1800手 params=(('size'.

qq_26742269的博客 5341

C++类的前置声明

一、类嵌套的疑问 C++头文件重复包含实在是一个令人头痛的问题,假设我们有两个类A和B,分别定义在各自的头文件A.h和B.h中,但是在A中要用到B,B中也要用到A,但是这样的写法当然是错误的: class B; class A{ public: B b;}; class B{ public: A a;}; 因为在A...

weixin_33816300的博客 589

笔记本电脑更换主板后出现2203:System configuration is invalid,以及2201、2202系统错误的解决

主板更换后刷新S/N

晓夏IT笔记 3519

前置声明(Forward Declaration)

前置声明的目的是为了告诉编译器某个实体的存在,以便在稍后的代码中引用它,而不必在声明的地方提供完整的定义。要声明变量,编译器需要更多的信息,这通常需要包含完整的类定义。前置声明告诉编译器类型的存在,但不提供关于该类型的大小和内部布局的信息,因此编译器无法生成正确的代码。需要注意的是,**前置声明只允许对被声明实体的指针和引用的操作,因为编译器不知道实体的具体定义,无法分配内存或访问其成员。这是最常见的前置声明,用于告诉编译器MyClass类的存在,以便在稍后的代码中引用它,而无需包含完整的类定义。

qq_40178082的博客 2658

【AMD显卡在WIndow10/11部署带GPU支持的深度学习环境(Pytorch-DirectML篇)】

这篇是之前Tensorflow-DirectML的姊妹篇,如果对TF感兴趣的可以搜索我的博文。 首先我们丢一个官网地址,但是官网那个会误导新人如果你按那个操作的话。 https://docs.microsoft.com/en-us/windows/ai/directml/gpu-pytorch-windows 这里用我的方法操作: 首先声明一下,因为我的显卡是AMD RX6600,不带XT(性能和RTX3060 12G版本半斤八两),所以目前没有最新的WSL2驱动,如果有了的话欢迎告知我,所以我这里就.

weixin_44029053的博客 2万+

ESP32IDF 通过 PCA9685控制舵机的程序bug处理

esp32 PCA9685 bug 舵机

ztvzbj的博客 726

c++ 前置声明

#pragma onceclass bar; class foo { public: Bar getBar(); private Bar* _bar; }; 即:在.h文件中用class 声明代替include头文件 前置声明只能作为指针或引用,不能定义类的对象,自然也就不能调用对象中的方法了。 前置声明要求: 1.其声明的类是文件所声明的类的数据成员时,是指针成员或引用成员(而不是对象成员); 2.其声明的类是文件所声明的类的成员函数的参数或返回值时,该函数在文件中不存在定义。 ...

baidu_16370559的博客 4770

电力现货市场出清机制与节点电价计算实战解析

本文深入解析了电力现货市场的出清机制,特别是节点边际电价的计算原理与实战应用。通过一个基于Matlab和IEEE30节点系统的完整案例,详细演示了如何利用最优潮流模型求解市场出清价格,并提取节点电价,揭示了电网阻塞如何影响实时电价的形成。

weixin_29061425的博客 950

C++中前置声明介绍

前置声明是指对类、函数、模板或者结构体进行声明,仅仅是声明,不包含相关具体的定义。在很多场合我们可以用前置声明来代替#include语句。类的前置声明只是告诉编译器这是一个类型,但无法告知类型的大小,成员等具体内容。在未提供完整的类之前,不能定义该类的对象,也不能在内联成员函数中使用该类的对象。而头文件则一一告之。前置声明,也称前向声明(forward declaration)。

weixin_58045467的博客 2501

YOLOv5改进之---EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU

本文主要针对yolov5的iou损失函数进行改进,主要涵盖EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU这几种损失

qq_41920323的博客 1466

MATLAB 基于 Baker 映射和 Logistic 混沌序列的图像加解密实现

图像加密是信息安全领域的重要研究方向,在数字版权保护、隐私保护等领域有着广泛应用。本文将介绍基于 MATLAB 的 Baker 映射和 Logistic 混沌序列的图像加解密算法,该算法利用混沌系统的初值敏感性和伪随机性,能够有效地对图像进行加密和解密。基于 Baker 映射和 Logistic 混沌序列的图像加解密算法是一种有效的方法,可以应用于数字版权保护、隐私保护等领域。MATLAB 提供了强大的工具和函数,可以方便地实现该算法。

走向CTO的路上... 937

关于前置声明:#include类和前置class类名的区别

今天看别人写的代码,用到了QTreeWidgetItem,这是QT自带的类,但是并没有#include<QTreeWidgetItem> 而是在头文件里写了类的声明: 然后用到这个类的函数接口: 你看用到的都是指针! 原来是因为当你在头文件声明成员变量或成员函数时,如果只需要用到某个类的指针而不需要用到类的对象,那么就可以直接只是声明一下这个类,不用include,这样可以...

$firecat利白的代码足迹$ 3134

YOLOv13必学核心:SKAttention选择性核注意力机制原理 + 实战全拆解

SKAttention的核心思想来源于人类视觉系统的一个重要特性:根据不同的视觉刺激,人眼能够自适应地调整感受野大小。SKAttention将这一生物学原理转化为深度学习中的注意力机制,通过动态选择和融合不同大小的卷积核,实现了自适应的多尺度特征提取。在人类视觉皮层中,不同的神经元具有不同大小的感受野,而且这些感受野的大小会根据视觉刺激的类型动态调整。本文将深入解析SKAttention模块的设计原理、数学基础、实现细节,以及其在YOLOv13目标检测框架中的集成应用,为读者提供全面而深入的技术理解。

FJN110的博客 97

C++ 在.h文件中包含头文件和在.cpp文件中包含头文件有什么区别?前置声明

Note:类A在编译的时候不需要拿到类B的定义是因为这里面定义的是指针,而对于指针是不需要定义就可以进行内存布局的,在编译A的类的声明的时候,在进行内存布局的时候是不需要拿到B的定义的。假设有两个类 A 和 B,A 类包含了 B 类的一个指针成员,并且在 A.cpp 文件中使用了 B 类的成员函数。6、如果a.c包含了头文件a.h,a.h包含了头文件b.h,b.c也包含了b.h,那么当b.h发生改变时,a.c和b.c都会重新编译。其中A类有一个成员b是Class B的指针,这个时候可使用类前置声明。

qq_40178082的博客 2538

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

一、类嵌套的疑问 C++头文件重复包含实在是一个令人头痛的问题,假设我们有两个类A和B,分别定义在各自的头文件A.h和B.h中,但是在A中要用到B,B中也要用到A,但是这样的写法当然是错误的: class B; class A{ public: B b; }; class B{ public: A a; }; 因为在A对象中要开辟一块属于B的空间,而B中又有A的空间,是一个逻辑错误,无法实现的,在这里我们只需要把其中的一个A

DayDayUp 2460

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++类前置声明和包含头文件的区别

转载自:C语言类前置声明和包含头文件的区别_Hesy_H的博客-优快云博客_c 前置声明 看完《Effective C++》条款31有感。。 尽量用前置声明代替头文件 假设有一个Date类 Date.h class Date { private: int year, month, day; }; 如果有个Task类的定义要用到Date类,有两种写法 其一 Task1.h class Date; class Task1 { public: Date getData(); }; 其二

csdndenglu的专栏 629

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++ 前置声明 和 包含头文件 如何选择

假设有一个Date类 Date.h class Date { private: int year, month, day; }; 如果有个Task类的定义要用到Date类,有两种写法 其一 Task1.h class Date; class Task1 { public: Date getData(); }; 其二 Task2.h ...

weixin_30477293的博客 259

C++中前置声明和头文件包含

假设有一个Date类 Date.h [cpp] view plaincopy class Date {   private:       int year, month, day;   };   如果有个Task类的定义要用到Date类,有两种写法 其一 Task1.h [cpp] view pla

EmSoftEn的专栏 1万+

C++类(一)——前置声明

忙完毕业的事情了。更新继续! 前置声明 转自——C++类的前置声明- King先生 - 博客园 链接整理 1、出错代码 //错误代码。报错:error C2079: 'b' uses undefined class 'B' class B; class A{ public: B b; }; class B{ public:...

一直走,不要回头 1071

c++ using 前置声明_C++类的前置声明

一、类嵌套的疑问C++头文件重复包含实在是一个令人头痛的问题,假设我们有两个类A和B,分别定义在各自的头文件A.h和B.h中,但是在A中要用到B,B中也要用到A,但是这样的写法当然是错误的:class B;class A{public:B b;};class B{public:A a;};因为在A对象中要开辟一块属于B的空间,而B中又有A的空间,是一个逻辑错误,无法实现的,在这里我们只需要把其中的...

weixin_33325305的博客 354

C++中类前置声明和包含头文件区别

C++头文件重复包含实在是一个令人头痛的问题,假设我们有两个类A和B,分别定义在各自的头文件A.h和B.h中,但是在A中要用到B,B中也要用到A,但是这样的写法当然是错误的:     class B; class A{       public:           B b; }; class B{       public:        

qq_28833741的博客 1958

C++ 在.h文件中包含头文件和在.cpp文件中包含头文件有什么区别?

现有两个文件Test.h 和Test.cpp #include <iostream>在Test.h中包含 和在Test.cpp中包含有什么区别? 1、在cpp文件中包含.h文件,要么你要用到这个头文件中的函数或者类,要么就是实现这个头文件; 2、.h---就是为了放一堆声明所产生的东西。 如果是定义放在.h中。 如果.h被重复包含多次,那么则会被报重定义。所以在....

积累点滴,保持自我 6624

漫谈:C C++ 嵌套包含与前置声明

漫谈:C C++ 嵌套包含与前置声明

编程之道在明明德在亲民在止于至善 1562

ZT 头文件包含其实是一想很烦琐的工作 第一个原则应该是,如果可以不包含头文件...

当出现访问类的函数或者需要确定类大小的时候,才需要用头文件(使用其类定义) http://blog.youkuaiyun.com/clever101/article/details/4751717 看到这个警告,我想你一定悟到了什么。下面我说说我的结论:类的前置声明和包含头文件的区别在于类的前置声明是告诉编译器有这种类型,但是它没有告诉编译器这种类型的大小、成员函数和数据成员,而包含头...

weixin_30755709的博客 168

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

在具体一点,以下代码大家都应该知道吧是显示widget窗口,不过因为otherwidget并未包含其完整定义所以导致,我不知道它来自于什么,我只知道他的类型是Widget *widget。但是注意什么叫做未包含完整定义呢,指的是编译器仅知道某个类或类型的存在,但不了解其具体的实现细节,像类的成员变量、成员函数的具体实现等。在源文件里,会包含必要的头文件,以获取相关的声明信息,进而完成具体的实现。所以我们还需要进入我们的.cpp文件,再去加入#include "widget",就包含了器完整定义。

2301_80657297的博客 427
上一篇: [C++]typedef typename什么意思?
下一篇: [C++]尽量用非成员函数,非友元函数替换成员函数
农夫三拳
博客等级 码龄18年 31粉丝 22原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值