引用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++中的前置声明的更多相关文章

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

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

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

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

  3. C++中头文件相互包含与前置声明

    一.类嵌套的疑问 C++头文件重复包含实在是一个令人头痛的问题,前一段时间在做一个简单的数据结构演示程序的时候,不只一次的遇到这种问题.假设我们有两个类A和B,分别定义在各自的有文件A.h和B.h中, ...

  4. C++中前置声明的应用与陷阱

    前置声明的使用 有一定C++开发经验的朋友可能会遇到这样的场景:两个类A与B是强耦合关系,类A要引用B的对象,类B也要引用类A的对象.好的,不难,我的第一直觉让我写出这样的代码: // A.h #in ...

  5. 【原创】SystemVerilog中的typedef前置声明方式

    SystemVerilog中,为了是代码简洁.易记,允许用户根据个人需要使用typedef自定义数据类型名,常用的使用方法可参见"define和typedef区别".但是在Syst ...

  6. C++ 类的前置声明

    http://www.2cto.com/kf/201311/260705.html    今天在研究C++”接口与实现分离“的时候遇到了一个问题,看似很小,然后背后的东西确值得让人深思!感觉在学习的过 ...

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

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

  8. C++_前置声明

    为什么要有前置声明? eg: -定义一个类 class A,这个类里面使用了类B的对象b,然后定义了一个类B,里面也包含了一个类A的对象a,就成了这样: //a.h #include "b. ...

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

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

随机推荐

  1. selectTree & bug

    selectTree & bug 相对路径 & 绝对路径 http://192.168.58.189:8080/hui/#/components/selectTree https:// ...

  2. 「BJWC2018」Border 的四种求法

    「BJWC2018」Border 的四种求法 题目描述 给一个小写字母字符串 \(S\) ,\(q\) 次询问每次给出 \(l,r\) ,求 \(s[l..r]\) 的 Border . \(1 \l ...

  3. bzoj3884上帝与集合的正确用法

    Description   根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“ ...

  4. Vitrualbox 桥接网卡界面名称未指定、Filters currently installed on the system have reached the limit、不能为虚拟电脑 打开一个新任务

    1. 桥接网卡界面名称未指定 http://wenku.baidu.com/link?url=VFG0hknsDX3VPXQoX5f-g1wUX_LBl-lOj0ZqD222kM31iVCPJKVu3 ...

  5. 前端学习 -- Css -- 字体

    设置字体颜色,使用color来设置文字的颜色 设置文字的大小,浏览器中一般默认的文字大小都是16pxfont-size设置的并不是文字本身的大小,在页面中,每个文字都是处在一个看不见的框中的我们设置的 ...

  6. WPF 杂谈——开篇简言

    这俩年多来笔者一直在从事关于WPF的开发.虽然不能说是专家级别的.但是对于WPF的应用还是有一定的了解.论他的灵活性决对不在WinForm之下.WPF的出现更是引发一段热议.他的何去何从更是让很多人感 ...

  7. Qt error ------ 'XXX' has not been declared

    1.头文件没加 2.调用函数者的头文件在XXX头文件的下方

  8. KVM安装、镜像创建(一)

    环境准备 VMware Workstation Pro启动虚拟化 查看启动的系统是否支持vmx或svm grep -E '(vmx|svm)' /proc/cpuinfo 备注:操作系统centos ...

  9. Java基础-编写问候语-“Hello World”

    Java基础-编写问候语-“Hello World” 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编写“Hello World”程序 1>.编写源代码 任何文本编辑起都 ...

  10. 2-SAT问题的方案输出

    2-sat 推荐学习资料: 伍昱的2003年IOI国家集训队论文<由对称性解2-sat问题> 论文链接:https://wenku.baidu.com/view/31fd7200bed5b ...