c++中的前置声明
引用google c++编码规范:
When you include a header file you introduce a dependency that will cause your code to be recompiled whenever
the header file changes. If your header file includes other header files, any change to those files will cause any code
that includes your header to be recompiled. Therefore, we prefer to minimize includes, particularly includes of header
files in other header files.
include一个头文件,就多了一种依赖,当头文件发生变化时,需要重新编译,因此尽量少用include,尤其是在头文件中包含头文件的情况下。
前置声明:减少include;解决循环依赖的问题。
如下,两个类中互包含了类对象成员,产生循环依赖。
class Barney{ Fred x; };
class Fred{ Barney y;};
在使用一个类之前,必须先定义该类。使用前置声明,在引用未定义的类之前,将该类的名字告诉编译器,使编译器知道那是一个类名。
注意:提供完整类定义之前,不能定义该类的对象,也不能在内联成员函数中使用该类的对象。
前置声明使用错误情况1、
class Fred;
class Barney{ Fred x; //error C2079: “Barney::x”使用未定义的 class“Fred” };
class Fred { Barney y; };
前置声明使用错误情况2、
class Fred;
class Barney
{
public: void method(){ x->dosomething(); //error C2227: “->dosomething”的左边必须指向类/结构/联合/泛型类型 }
private: Fred *x;
};
class Fred
{
public: void dosomething(){};
private: Barney *y;
};
解决的办法:
修改两个类的定义顺序,或者将method改为非内联函数。
class Fred;
class Barney
{
public: void method();
private: Fred *x;
};
class Fred
{
public: void dosomething(){};
private: Barney *y;
};
//改成非内联函数,在Fred完整定义后在给出函数定义,或者更改两个类定义的顺序。
void Barney::method() { x->dosomething(); }
综上,使用前置声明可以解决循环包含的部分问题。另外要避免互相定义使用类对象的情况。
google编码规范在头文件中使用前置声明的注意事项:
How can we use a class Foo in a header file without access to its definition?
- We can declare data members of type Foo* or Foo&.
- We can declare (but not define) functions with arguments, and/or return values, of type Foo. (One exception is if an argument Foo or const Foo& has a non-explicit, one-argument constructor, in which case we need the full definition to support automatic type conversion.)
- We can declare static data members of type Foo. This is because static data members are defined outsidethe class definition.
摘自c++ primer:
class Screen;
前置声明,也称前向声明(forward declaration)。在声明之后,定义之前,类Screen是个不完整类型(incomplete type),即已知Screen是一个类型,但是不知道包含哪些成员。
不完全类型只能以有限方式使用。不能定义该类型的对象。不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。
关键,区分下声明和定义。
c++中的前置声明的更多相关文章
- 关于C++中的前置声明(附程序运行图)
实验于华中农业大学逸夫楼2017.3.10 在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration).下面的程序中,带注释的那行就是类B的前置说明.这是必须的,因为类A中 ...
- C++中前置声明介绍
前置声明是指对类.函数.模板或者结构体进行声明,仅仅是声明,不包含相关具体的定义.在很多场合我们可以用前置声明来代替#include语句. 类的前置声明只是告诉编译器这是一个类型,但无法告知类型的大小 ...
- C++中头文件相互包含与前置声明
一.类嵌套的疑问 C++头文件重复包含实在是一个令人头痛的问题,前一段时间在做一个简单的数据结构演示程序的时候,不只一次的遇到这种问题.假设我们有两个类A和B,分别定义在各自的有文件A.h和B.h中, ...
- C++中前置声明的应用与陷阱
前置声明的使用 有一定C++开发经验的朋友可能会遇到这样的场景:两个类A与B是强耦合关系,类A要引用B的对象,类B也要引用类A的对象.好的,不难,我的第一直觉让我写出这样的代码: // A.h #in ...
- 【原创】SystemVerilog中的typedef前置声明方式
SystemVerilog中,为了是代码简洁.易记,允许用户根据个人需要使用typedef自定义数据类型名,常用的使用方法可参见"define和typedef区别".但是在Syst ...
- C++ 类的前置声明
http://www.2cto.com/kf/201311/260705.html 今天在研究C++”接口与实现分离“的时候遇到了一个问题,看似很小,然后背后的东西确值得让人深思!感觉在学习的过 ...
- C++ 前置声明 和 包含头文件 如何选择
假设有一个Date类 Date.h class Date { private: int year, month, day; }; 如果有个Task类的定义要用到Date类,有两种写法 其一 Task1 ...
- C++_前置声明
为什么要有前置声明? eg: -定义一个类 class A,这个类里面使用了类B的对象b,然后定义了一个类B,里面也包含了一个类A的对象a,就成了这样: //a.h #include "b. ...
- C++ 类声明 类前置声明范例
转载自http://www.cnblogs.com/staring-hxs/p/3244251.html 在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration).下面的 ...
随机推荐
- DELPHI 数据集在内存中快速查询方法
1.Bookmark var p:pointer; procedure TForm1.Button1Click(Sender: TObject);//加个标签 begin p:=cxGrid1DB ...
- pgm9
这部分介绍 sampling 方法,书上也称为 particle-based method,这是因为每一个从分布中采集到的样本可以看成是一个 particle(instantiation of r.v ...
- 99种用Racket说I love you的方式
99种用Racket说I love you的方式 来源 https://www.tuicool.com/articles/qiyeAz 原文 http://www.soimort.org/posts ...
- error::尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。
1.VS出现此问题 问题分析:本地电脑安装的oracle客户端为64位客户端,vs启动网站默认启动自带的32位IIS Express,所以出错. 解决方案: 方案1.本地电脑安装oracle32位客户 ...
- 在PE32位下安装64位2003、2008系统
步骤 1.进PE(这里是老毛桃为例) 2.将系统(这里windows2008 r2 为例)拷到本地硬盘 3.将ios镜像出来 4.在PE桌面找到 “windows系统安装”,浏览 系统文件 \sou ...
- 自学huawei之路-6005-8AP设备启动界面
返回自学Huawei之路 自学huawei之路-AC6005-8AP设备启动界面 [YK-MES-MASTER] Please check whether system data has been c ...
- 【BZOJ1294】[SCOI2009]围豆豆(动态规划,状压)
[BZOJ1294][SCOI2009]围豆豆(动态规划,状压) 题面 BZOJ 洛谷 题解 首先考虑如何判断一个点是否在一个多边形内(不一定是凸的),我们从这个点开始,朝着一个方向画一条射线,看看它 ...
- 洛谷 P1144 最短路计数 解题报告
P1144 最短路计数 题目描述 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 第一行包含2个正 ...
- tomcat 性能调优
1. 内存 windows在bin/catalina.bat的注释下第一行加入 set JAVA_OPTS=-Xms2048m -Xmx2048m -Xss128K -XX:PermSize=64m ...
- 网络编程之tcp窗口滑动以及拥塞控制
TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现.一.滑动窗口协议 关于这部分自己不晓得怎么叙述才好,因为理解的部 ...