gpt4 book ai didi

c++ - 为什么在同一个 cpp 文件中包含 header 和前向声明包含的类?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:02:56 24 4
gpt4 key购买 nike

我一直在为我的大学项目查看 Fear SDK,但注意到一些代码如下:

Foo.h

class Foo
{
public:
int iSomething;
};

酒吧.cpp:

#include "Foo.h"

// Forward declarations
class Foo;

在同一 cpp 文件中转发声明并包含适当的 header 是否有任何特殊原因?还是前向声明是多余的,因为包含了 header ?

编辑:

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

最佳答案

这不仅是多余的,而且可能存在问题。 Say Foo.h 发生变化,因此 Foo 成为通用的、模板化等价物的某个特定实例的类型定义——这种东西可以预期为正常软件进化的一部分。然后 Bar.cpp 的“X 类”将不必要地导致编译错误:

--- 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

这是我一直推荐使用专用前向声明 header 的原因之一 <iosfwd> ,由主标题维护并包含在其中,以确保持续的一致性。我从不放“X 类;”在实现文件中,除非类也在其中定义。请记住,“X 类;”表面上的好处。前向声明与其说是避免 #include ,而且它们包含的文件可能很大,进而包含许多其他文件:专用的前向声明 header 通常无论如何都会避免其中的绝大多数。

关于c++ - 为什么在同一个 cpp 文件中包含 header 和前向声明包含的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4928837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com