我一直在为我的大学项目寻找恐惧SDK,但是注意到了一些类似的代码:
foo.h中
class Foo
{
public:
int iSomething;
};
Bar.cpp:
#include "Foo.h"
// Forward declarations
class Foo;
是否有任何特殊原因要转发声明并在同一个cpp文件中包含相应的标头?或者前向声明是多余的,因为包含了标题?
编辑:
每次我在代码中看到它时,include语句总是在前向声明之前。
答案 0 :(得分: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
这是我总是建议使用专用前向声明标头ala <iosfwd>
的原因之一,由主标头维护和包含,以确保持续的一致性。我从来没有把“X级”;在实现文件中,除非在那里定义了类。请记住“X级”的看似好处;前向声明并不是因为它们避免使用#include
,而是它们包含的文件可能很大,而且包含很多其他文件:专用的前向声明标题通常会避免绝大多数。
答案 1 :(得分:3)
如果前向声明位于包含之前,则可能会消除依赖性。在定义它的实际.h文件之后无效。
答案 2 :(得分:2)
原class Foo;
可能是遗留问题。
请记住,如果源只使用指向Foo类的指针[并且实际上并不尝试创建Foo对象或取消引用Foo指针],则在使用它之前不需要定义该类。
如果没有看到代码,我就会猜测bar.cpp的原始版本的代码不需要foo的定义
我在大型项目中使用前向声明来减少编译时间。编译时间不是一个问题需要一秒钟,但是当项目需要一个小时来构建每一秒时有帮助:)
答案 3 :(得分:1)
前向声明是多余的,但也非常无害。也许作者使用了很多前瞻性声明,并没有严格确保它们始终是必需的。