#include和前置声明(forward declaration)
1.    当不需要调用类的实现时,包括constructor,copy constructor,assignment operator,member function,甚至是address-of operator时,就不用#include,只要forward declaration就可以了。
2.   当要用到类的上面那些“方法”时,就要#include
 
例子:
boy.h
#ifndef __BOY__H_
#define __BOY__H_
#include<string>
using namespace std;
 
class Boy {
private:
    string name;
    int age;
};
 
#endif
 
test1.h
#include<iostream>
 
class Boy;
class People {
    Boy getBoyInfo();
};
 
test2.h
#include<iostream>
#include "boy.h"
 
class Boy;
class People {
    Boy getBoyInfo();
};
一个采用前置声明,一个采用#include "boy.h"加入了Boy的定义。两种方法都能通过编译。但是test1.h 这种写法更好。如果boy.h 的private成员变量改变,比如变成 char *name; test1.h 不需要重新编译,而test2.h 就要重新编译,更糟的是如果test2.h 还与其他很多头文件有依赖关系,就会引发一连串的重新编译,花费极大的时间。可是事实上改变一下写法就可以省去很多功夫。所以能用前置声明代替#include 的时候,尽量用前置声明
有些情况不能用前置声明代替#include
 
比如test1.h改成
#include<iostream>
using namespace std;
 
class Boy;
class People {
public:
    Boy boy;
};
 
test.cpp:7:9: error: field ‘boy’ has incomplete type
     Boy boy;
         ^
会编译错误,因为Boy boy定义了一个Boy类型变量,编译器为boy分配内存空间的时候必须知道boy的大小,必须包含定义Boy类的boy.h文件。
这是可以采用指针来代替
#include<iostream>
using namespace std;
 
class Boy;
class People {
public:
    Boy *boy;
};
指针的大小是固定的。在32位机上是4字节,64位机上是8字节。这时编译Task1的时候不需要Boy的大小,所以和Boy的定义无关。
如果使用object reference 或 object point 可以完成任务,就不要用object
这样可以尽最大可能避免#include
为声明式和定义是提供不同的头文件
第一个原则应该是,如果可以不包含头文件,那就不要包含了。这时候前置声明可以解决问题。如果使用的仅仅是一个类的指针,没有使用这个类的具体对象(非指针),也没有访问到类的具体成员,那么前置声明就可以了。因为指针这一数据类型的大小是特定的,编译器可以获知。
  第二个原则应该是,尽量在CPP文件中包含头文件,而非在头文件中。假设类A的一个成员是是一个指向类B的指针,在类A的头文件中使用了类B的前置声明并编译成功,那么在A的实现中我们需要访问B的具体成员,因此需要包含头文件,那么我们应该在类A的实现部分(CPP文件)包含类B的头文件而非在声明部分(H文件)包含。 

#include和前置声明(forward declaration)的更多相关文章

  1. 正确使用#include和前置声明(forward declaration)

    http://blog.csdn.net/SpriteLW/article/details/965702

  2. 宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前向声明 编程定律 先强调一点:在一切可 ...

  3. 关于C++中的前置声明(附程序运行图)

    实验于华中农业大学逸夫楼2017.3.10 在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration).下面的程序中,带注释的那行就是类B的前置说明.这是必须的,因为类A中 ...

  4. C++ 类声明 类前置声明范例

    转载自http://www.cnblogs.com/staring-hxs/p/3244251.html 在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration).下面的 ...

  5. 【C++】类前置声明范例

    • 在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration).下面的程序中,带注释的那行就是类B的前置说明.这是必须的,因为类A中用到了类B,而类B的声明出现在类A的后面 ...

  6. C++中前置声明介绍

    前置声明是指对类.函数.模板或者结构体进行声明,仅仅是声明,不包含相关具体的定义.在很多场合我们可以用前置声明来代替#include语句. 类的前置声明只是告诉编译器这是一个类型,但无法告知类型的大小 ...

  7. c++ 类前置声明【转】

    [转自 here] 在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration).下面的程序中,带注释的那行就是类B的前置说明.这是必须的,因为类A中用到了类B,而类B的声明 ...

  8. forward declaration of class 错误

    在使用Qt的时候遇到这个错误,查了一下发现,是因为我没有正确的使用前置声明. #ifndef FIRSTPAGE_H #define FIRSTPAGE_H #include "ui_dia ...

  9. c++中的前置声明

    引用google c++编码规范: When you include a header file you introduce a dependency that will cause your cod ...

随机推荐

  1. <读书笔记>JavaScript系列之7种创建对象(面向对象)

    写在前面: 以下三选一: 阅读博文JavaScript 对象详解. 阅读<JavaScript权威指南>第6章. 阅读<JavaScript高级程序设计>第6章. 注意:只需要 ...

  2. 我的WordPress站点

    读取VDI文件 SSL和TLS Windows下使用vim的最佳方案:Sublime gdb用法 VMware的Guest与Host进行通信的三种方式 加密与解密 漫谈保护模式 processing学 ...

  3. 斯坦福【概率与统计】课程笔记(三):EDA | 直方图

    单个定量变量的直方图表示 大家知道,定量变量是连续型变量,即不会像分类变量那样有明显的分类,那么如何将其画成直方图呢?一般来说,会将其按照某个维度来将其分组(group),举个例子. 我们有15个学生 ...

  4. EasyUI 的日期控件单击文本框显示日历

    注意:可 用 ctrl+f 搜索 "_outerWidth():0" 1. jQuery.easyui.min.js1.3.2 版本   function _745(_746,_7 ...

  5. git提交时,仓库是空的,本地有源码。

    应该打开cmd   归到项目路径 然后输入git push -u origin master -f 是把本地的项目强制推送到空的仓库 git init (在当前文件夹下初始化一个git仓库) git ...

  6. spring注解开发:ComponentScan组件扫描

    在使用xml方式配置时,我们只需要在xml中配置如下代码: <context:component-scan base-package="包名"></context ...

  7. Fiddler设置展示接口响应时间

    在Tool bar上面找到Rules->CustomRules 在class Handlers{   里面添加 function BeginRequestTime(oS: Session){  ...

  8. JavaScript的日期对象

    1.Date对象用来处理日期和时间. 2.创建Date对象的语法: var myDate = new Date(); 3.Date对象的常用方法: 格式:Date.XX(); getDate() 从 ...

  9. Unity接入AbMob踩坑记

    之前是配置好的环境,不知道怎么突然就不正常了. 一直弹出下面的报错: Error running CocoaPods. Please ensure you have at least version ...

  10. git pull的时候发生冲突的解决方法之“error: Your local changes to the following files would be overwritten by merge”

    今天在使用git pull 命令的时候发生了以下报错 目前git的报错提示已经相关友好了,可以直观的发现,这里可以通过commit的方式解决这个冲突问题,但还是想看看其他大佬是怎么解决这类问题的 在网 ...