类前置声明的使用

今天在写代码时,遇到了是否需要加头文件的问题,看到这个博客之后收益匪浅,因此转载该篇文章。

转载:https://www.jianshu.com/p/9768175387b6

首先我们看这样一个示例程序:

以上代码中,类CY中有个CX类型的数据成员,我们需要在CY.h中包含CX.h才能编译通过。所以,我们说这里的CY类依赖CX类,当CX.h修改导致CX对象的大小发生变化时(比如,新增一个数据成员或新增一个方法时), CY.cpp都需要重新编译。这在大型工程中可能会造成巨大的编译成本.

有没有办法解决这个问题? 有!使用类前置声明。

我们先看看修改之后的代码。

这里首先将CX.h的包含语句修改为CX的类前置声明,然后数据成员由CX对象修改为指向CX对象的指针。但是奇怪的是,如果不将CX对象修改为指向CX对象的指针,还是会编译出错。

error C2079: “CY::m_x2”使用未定义的 class“CX”

只能在指针或引用类型上使用类前置声明

当CY.h中的数据成员是CX对象时,CY.h需要知道CX对象的大小,当CX.h发生修改,例如向CX类添加数据成员或者方法成员,CX对象大小发生改变,所以CY.cpp必须重新编译。

当CY.h中的数据成员是指向CX对象的指针时,CY.h并不需要知道CX对象的大小,因为指向CX对象的指针在给定平台上的大小是固定的。所以,只需要一种“非完整性声明”,也即这里的类前置声明。

引用的本质还是指针,所以类前置声明也适合引用的情况。

可以使用类前置声明的几种情况

1. CY有一个类型为指向CX的指针的成员变量。

2. CY有一个类型为容器成员,且容器类的元素是指向CX的指针。但是如果元素是CX对象的话,则会编译出错,原因是CY需要知道CX对象的大小。

3. CY中有一个函数,它的返回值是CX对象/指向CX的指针/指向CX的引用,或者它的参数是CX对象/指向CX的指针/指向CX的引用。

总结

合理的使用类前置声明,不仅可以减少工程编译的时间,更重要的是,可以让你从更深的视角洞察工程的物理依赖关系,从而为代码重构提供依据。在写代码的时候,不妨经常问一下自己:我是否真的有必要在这个头文件里包含另一个头文件?
 

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

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

相关文章

dom nodeName nodeType nodeValue

1&#xff0c;nodeName属性 &#xff1a; 节点的名字。如果节点是元素节点&#xff0c;那么返回这个元素的名字。此时&#xff0c;相当于tagName属性。比如<p>aaaa</p> : 则返回 p 如果是属性节点&#xff0c;nodeName将返回这个属性的名字。如果是文本节点&…

谈谈CLOSE_WAIT

TCP 有很多连接状态&#xff0c;每一个都够聊十块钱儿的&#xff0c;比如我们以前讨论过 TIME_WAIT 和 FIN_WAIT1&#xff0c;最近时不时听人提起 CLOSE_WAIT&#xff0c;感觉有必要梳理一下。 所谓 CLOSE_WAIT&#xff0c;借用某位大牛的话来说应该倒过来叫做 WAIT_CLOSE&…

Windows Phone 7 自适应键盘输入

在移动设备上由于空间比较小&#xff0c;例如手机的屏幕&#xff0c;所以显示完整的输入键盘不行或者不美观。因此程序需要处理键盘的呈现&#xff0c;比如一个Textbox控件&#xff0c;我们只想输入数字&#xff0c;那么如果不处理还会显示字母的输入界面&#xff0c;这样即占用…

201673020127 词频统计软件项目报告

需求分析 从给定文本中得出单词频数的统计数据。 功能设计 首要功能是统计指定文本中的词频&#xff0c;保证其健壮性。在此基础上还需实现显示对指定单词的统计结果&#xff0c;显示指定数目高频单词的统计结果以及将统计结果输出至结果文件等功能。 设计实现 主程序使用无限循…

如何把Access转成SQL Server的方法介绍

1、打开“控制面板”下“管理工具”中的“数据库源”。 2、按“添加”添加一个新的数据源&#xff0c;在选择栏里选“Driver do microsoft Access (*.mdb)”&#xff0c;完成后将出现一个框&#xff0c;在“数据库源”里面输入你想写的名称&#xff0c;我取名叫“ABC”&#xf…

c/c++ 前置声明 -- typedef问题

前几天写过前置声明的问题&#xff0c;不过今天写代码时又遇到了同样的问题&#xff0c;不过是一个typedef出来的问题。 前置声明的好处很多, 比如能避免头文件互相包含的冲突, 比如有时我们在一个头文件中只需要另一个头文件的某个类型定义, 只需要对它做一下前置声明即可, 因…

.读取excel表格(JAVA)

读取excel表格&#xff08;JAVA&#xff09;偶尔写个小程序&#xff0c;让办公更简单一些。在这里使用到JXL(Java Excel API)用来动态读写Excel文件。JXL的主页是&#xff1a;http://www.andykhan.com/jexcelapi/&#xff0c;可以在这里下载到它的最新的版本。将包下载下来后将…

TextTree - 文本资料收集轻量级工具

你有没有收集资料的习惯? 如果有久而久之你会发现资料越来越多,找起来很麻烦. 过去我收集资料,单个文件,资料太多不好找,就分成多个文件. 文件一多,有时会乱放,结果结果经常满硬盘搜索,就为了找一个文件,于是我后来就集中放在同一个文件夹. 文件夹里的文件一多,看文件名也是眼…

Spring Boot分布式系统实践【扩展1】shiro+redis实现session共享、simplesession反序列化失败的问题定位及反思改进...

前言 调试之前请先关闭Favicon配置 spring:favicon:enabled: false 不然会发现有2个请求&#xff08;如果用nginx 浏览器调试的话&#xff09; 序列化工具类【fastjson版本1.2.37】 public class FastJson2JsonRedisSerializer implements RedisSerializer { public static fin…

svn: E200033: database is locked, executing statement 'RELEASE   s0' 问题解决办法

前几天svn迁移到其他路径之后&#xff0c;今天早上更新代码时&#xff0c;出现了下面的问题&#xff1a; svn: E200033: database is locked, executing statement RELEASE s0 稍后执行了 svn cleanup svn up 等命令之后都不好使 网上查找资料尝试整了一遍之后是可以的&…

Apache + Tomcat 配置多个应用

转自&#xff1a;http://www.360doc.com/content/11/0415/11/1531394_109787714.shtml转载于:https://www.cnblogs.com/ribavnu/archive/2012/11/06/2757390.html

哈希(hash)表查找速度为什么那么快?快在哪里了?

先看数组存储数据是怎么样的。 现在有一个数组&#xff0c;它里面每个单元存储的是数据的地址 这叫指针数组吧&#xff0c;假设它有100个单元 我们称他为p[100] 现在我想把一百个数据&#xff08;地址&#xff09;放到里面 我们想把某个数据放到p的第几个单元完全是由 我…

Getting Started with the Table Component

为什么80%的码农都做不了架构师&#xff1f;>>> Home Wiki Getting Started with the Table Component Getting Started with the Table Component Table of Contents [hide] Creating Your First Report using the Table Component Step 1: Create a datasourc…

.NET Framewrok 4.0新增类库

转载于:https://www.cnblogs.com/tweet/archive/2010/02/08/1665805.html

在构造函数/析构函数中调用virtual函数带来的影响

在构造函数/析构函数中调用virtual函数&#xff0c;那么调用的一定是本类中的virtual函数。 先看一段代码&#xff1a; #include<iostream>class Base { public:Base() {print();}~Base() {print();}virtual void print() {std::cout << "Base::print"…

编程之美-第3章 结构之法

3.1. 字符串移位包含问题 方法1: 分别对字符串进行循环移1位,2位,3位…,来判断给定的字符串是否是其中一个字串. 复杂度是O(n^3) 方法2: 这也是一种利用空间换时间的方法. 代码如下, 为了简便实现,采用了C库中的字符串操作函数: #if 0 /** 3.1*/ bool isRotate(char *s1,char* …

每天学习一点点(2010年二月)

2010/2/8号 星期一 1.决定记录下每天学到的东西和感悟 2.看老赵的博客&#xff0c;学到一句话&#xff1a;Apple告诉我们的铁律是&#xff1a;表面功夫一定要做足。 3.看到一个笑话&#xff1a;你属什么&#xff1f;我属 于你。 2010/2/9号 星期二 1.减少页面中独立的请求数&…

InnoDB一棵B+树可以存放多少行数据?

一个问题&#xff1f; InnoDB一棵B树可以存放多少行数据&#xff1f;这个问题的简单回答是&#xff1a;约2千万。为什么是这么多呢&#xff1f;因为这是可以算出来的&#xff0c;要搞清楚这个问题&#xff0c;我们先从InnoDB索引数据结构、数据组织方式说起。 我们都知道计算…

调整路由的AD值

实验&#xff1a;调整路由的AD值【实验名称】调整路由的AD值 (注意&#xff1a;PT有可能不支持distance 99 192.168.1.2 0.0.0.0这条命令&#xff0c;所以我们做实验的时候最好用小凡模拟器)【实验目的】通过调整路由的管理距离值&#xff0c;实现路由的管理和控制【实验背景】…

C#学习日志三(流程控制语句)

if条件语句&#xff1a;根据某个条件对成都的执行进行两路分支。语法&#xff1a;if(条件){语句块1}else{语句块2}*else部分并不是必须存在的。 switch...case条件选择语句&#xff1a;当分支条件很多时&#xff0c;使用。语法&#xff1a;switch(控制表达式){case 常量表达式1…