gpt4 book ai didi

C++ 前向声明和 header 包含

转载 作者:太空狗 更新时间:2023-10-29 23:02:34 25 4
gpt4 key购买 nike

我有一个关于何时使用前向声明与包含 header 的问题。我知道那里有很多类似的问题,但只有一件事有点令人困惑。

我在查看的源代码中看到了以下方式:

classA.h

#ifndef H_CLASSA
#define H_CLASSA

class classB;

class classA {
public:
classA(B* b);
};

然后在classA.cpp中:

#include "classA.h"
#include "classB.h" // dependency
classA::classA(B* b) { b->someMethod(); }

在这种情况下,我只是从一开始就将 #include "class.b"放在 classA-header 中,因为 A 依赖于类 B 并使用它。但我不明白为什么要先在 header 中转发声明 classB,然后在源文件中包含 classB.h?

提前致谢!

最佳答案

为了防止循环包括:

假设我们有以下包含路径:(每个 [] 是一个头文件,每个 -> 是包含)

[A] -> [B] -> [C]

到目前为止一切顺利。但是 如果 [A] 有一些类或函数将 [C] 中的一些对象作为参数,会发生什么?所以我们可以只包括(就像你说的)[A] 中的 [C]。不,我们可能会遇到以下问题:1)这个通告包括可能会导致一些错误的编译器:首先,C包含B,B包含A,但A包含C!循环继续递归。2) 假设 [A] 有一个类 A,[B] 有一个继承自 A 的类 B,[C] 有一个继承自 B 的类 C。假设编译器可以处理错误 1,但您仍然可能会收到“未定义基类”错误,因为 [A] 已编译,在编译 A 之前,包含的所有 header ([B] 和 [C])都是编译。 C 被编译为 A 和 B 的子类,但是嘿,此时 B 和 A 甚至不存在!

这是前向声明派上用场的地方。它允许我说“有 2 个类,B 和 C,仍然没有编译”,并且在 cpp 文件中实际使用头文件

但是这个方案还是有一些问题。您只能使用前向声明为指针和引用的类。但是,即便如此,还是极力推荐将对象作为引用或常量引用传递。因此您可以在 [A] 中使用 C 和 B 作为引用。

关于C++ 前向声明和 header 包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28016128/

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