zoukankan      html  css  js  c++  java
  • 关于c++的头文件依赖

    https://en.wikipedia.org/wiki/Forward_declaration

    In C++, classes and structs can be forward-declared like this:

    class MyClass;
    struct MyStruct;

    关于c++的头文件依赖

    正在看google c++编程规范,里面对头文件依赖是这么说的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    使用前置声明(forward declarations)尽量减少.h文件中#include的数量。
    当一个头文件被包含的同时也引入了一项新的依赖(dependency),只要该头文件被修改,代码就要重新编译。如果你的头文件包含了其他头文件,这些头文件的任何改变也将导致那些包含了你的头文件的代码重新编译。因此,我们宁可尽量少包含头文件,尤其是那些包含在其他头文件中的。
    使用前置声明可以显著减少需要包含的头文件数量。举例说明:头文件中用到类File,但不需要访问File的声明,则头文件中只需前置声明class File;无需#include "file/base/file.h"
    在头文件如何做到使用类Foo而无需访问类的定义?
    1) 将数据成员类型声明为Foo *或Foo &;
    2) 参数、返回值类型为Foo的函数只是声明(但不定义实现);
    3) 静态数据成员的类型可以被声明为Foo,因为静态数据成员的定义在类定义之外。
    另一方面,如果你的类是Foo的子类,或者含有类型为Foo的非静态数据成员,则必须为之包含头文件。
    有时,使用指针成员(pointer members,如果是scoped_ptr更好)替代对象成员(object members)的确更有意义。然而,这样的做法会降低代码可读性及执行效率。如果仅仅为了少包含头文件,还是不要这样替代的好。
    当然,.cc文件无论如何都需要所使用类的定义部分,自然也就会包含若干头文件。
    译者注:能依赖声明的就不要依赖定义。

      于是在VC下做了下测试,先自行建立Foo.h,Foo.cpp文件,里面定义一个类CFoo,不用管怎么定义,随便都行,然后建议main.cpp,在里面测试:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class CFoo;
    class test
    {
    public:
        /*1*/ CFoo func(CFoo foo);//ok
        /*2*/ static CFoo sub;//ok
        /*3*/ CFoo& foo1;//ok
        /*4*/ CFoo* pfoo1;//ok
        /*5*/ CFoo foo; //error
    };

      之前都是直接include Foo.h 文件,这次不引用,而是声明一下CFoo类。下面看test类的声明。

    1、正确。说明了规范中第2点,函数参数和返回值只是声明。

    2、正确。说明了规范中第3点,静态数据成员的类型可以被声明为Foo,因为静态数据成员的定义在类定义之外。

    3、4、正确。5错误。说明了规范中第1点,非静态的数据成员必须是指针或引用,否则需要依赖定义,其实也好理解,非静态表示每个实例都占有内存,必然需要知道内存的大小,没有定义怎么能知道呢?

  • 相关阅读:
    Python实现杨辉三角
    第8.30节 重写Python __setattr__方法实现属性修改捕获
    转:Cookie详解
    第8.29节 使用MethodType将Python __setattr__定义的实例方法与实例绑定
    第8.28节 Python中使用__setattr__定义实例变量和实例方法
    第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析
    第8.26节 重写Python类中的__getattribute__方法实现实例属性访问捕获
    关于open函数文件打开模式的有意思的一个现象
    第8.25节 Python风格的__getattribute__属性访问方法语法释义及使用
    转:关于Python中的lambda,这篇阅读量10万+的文章可能是你见过的最完整的讲解
  • 原文地址:https://www.cnblogs.com/faeriesoft/p/5087510.html
Copyright © 2011-2022 走看看