为什么要包含一个头和前向声明包含在同一个cpp文件中的类?

Ray*_*Dey 5 c++ header forward-declaration

我一直在为我的大学项目寻找恐惧SDK,但是我注意到了一些类似的代码:

foo.h中

class Foo
{
    public:
        int iSomething;
};
Run Code Online (Sandbox Code Playgroud)

Bar.cpp:

#include "Foo.h"

// Forward declarations
class Foo;
Run Code Online (Sandbox Code Playgroud)

是否有任何特殊原因要转发声明并在同一个cpp文件中包含相应的标头?或者前向声明是多余的,因为标题包含在内?

编辑:

每次我在代码中看到它时,include语句总是在前向声明之前.

Ton*_*roy 6

它不仅仅是多余的,而且可能存在问题.假设Foo.h发生了变化,所以Foo成为了一个特定实例化的一个类型定义,这个实例是一个通用的,模板化的等价物 - 可以作为正常软件演化的一部分预期的东西.然后Bar.cpp的"类X"将不必要地导致编译错误ala:

--- fwd.h ---
template <typename T>
class XT
{
  public:
    int n_;
};

typedef XT<int> X;

--- fwd.cc ---
#include "fwd.h"

class X;

int main()
{
    X x;
    x.n_ = 0;
    return x.n_;
}

--- compilation attempt ---
~/dev  .../gcc/4.1.1/exec/bin/g++ fwd.cc -o fwd
fwd.cc:3: error: using typedef-name 'X' after 'class'
fwd.h:8: error: 'X' has a previous declaration here
Run Code Online (Sandbox Code Playgroud)

这是我总是建议使用专用前向声明标头ala的一个原因<iosfwd>,由主标头维护和包含,以确保持续的一致性.我从来没有把"X级"; 在实现文件中,除非在那里定义类.请记住"X级"的看似好处; 前向声明并不是因为它们避免了#include,而且它们包含的文件可能很大,而且包含很多其他文件:专用的前向声明标题通常会避免绝大多数.