前置声明的总结

昨天遇到代码单侧时候无法编译的问题。定位到是出现互相包含,导致出现未声明的错误;解决的办法显然使用绿前置声明,并去掉头部中互包含头文件,仅在cpp中包含(在实现部分)。

那究竟声明是前置声明,何时使用呢?

google c++ 风格指南中定义

所谓「前置声明」(forward declaration)是类、函数和模板的纯粹声明,没伴随着其定义.

使用原则:

  1. 头文件中尽量可不或重复包含头文件,优先使用前置声明;
  2. 固定大小,而且在头文件中编译无需确定其大小, 如指针或引用,返回值和参数的类型。
  3. 头文件中未使用其对象的成员。
  4. 类型为普通类而非函数模版。

前置声明优点:

  1. 减少头文件大小,对于指针等在32位机上是4字节,64位机上是8字节。
  2. 接口与实现分离。
  3. 降低类模块之间的耦合,减少依赖;避免不必要的重新编译。

注意:不必只是为了避免使用#include,而用指针成员替代对象成员。选择使用前置声明时注意隐式包拷贝构造函数的调用。

举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//不同名字空间的前置声明方式
#include <list>
#include <vector>
#include <map>
#include <utility>
namespace test1
{
class C;
}
namespace test2
{
using test1::C;
class A
{
public:
C useC(C);
C& doToC(C&);
C& doToC2(C& c) {return doToC(c);};
private:
std::list<C> _list;
std::vector<C> _vector;
std::map<C, C> _map;
C* _pc;
C& _rc;
}
}

参考:


http://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/headers/#forward-declarations
http://blog.csdn.net/emsoften/article/details/50374232

2017年书单

  • 《Effective C++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)》内容简介:有人说C++程序员可以分为两类,读过Effective C++的和没读过的。世界项级C++大师scott Meyers成名之作的第三版的确当得起这样的评价。当您读过《Effective C++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)》之后,就获得了迅速提升自己C++功力的一个契机。
  • 《C++沉思录》基于作者在知名技术杂志发表的技术文章、世界各地发表的演讲以及斯坦福大学的课程讲义整理、写作而成,融聚了作者10多年C++程序生涯的真知灼见。
  • 《程序员的数学》本书还对程序员和计算机的分工进行了有益的探讨。读完此书,你会对以程序为媒介的人机合作有更深刻的理解。

待续… 👍
Image of octofez