c++ - C++ 中相互包含的 header

标签 c++ recursion header include

我是 C++ 新手,但我无法在网上找到这个(很可能是微不足道的)问题的答案。我在编译一些两个类相互包含的代码时遇到了一些麻烦。首先,我的#include 语句应该放在宏的内部还是外部?在实践中,这似乎并不重要。但是,在这种特殊情况下,我遇到了麻烦。将#include 语句放在宏之外会导致编译器递归并给我“#include 嵌套太深”的错误。这对我来说似乎很有意义,因为在调用 #include 之前没有完全定义任何类。然而,奇怪的是,当我尝试将它们放入其中时,我无法声明其中一个类的类型,因为它无法识别。本质上,这就是我要编译的内容:

啊.h

#ifndef A_H_
#define A_H_

#include "B.h"

class A
{
    private:
        B b;

    public:
        A() : b(*this) {}
};

#endif /*A_H_*/

B.h

#ifndef B_H_
#define B_H_

#include "A.h"

class B
{
    private:
            A& a;

    public:
        B(A& a) : a(a) {}
 };

#endif /*B_H_*/

main.cpp

#include "A.h"

int main()
{
    A a;
}

如果有什么不同,我使用的是 g++ 4.3.2。

为了清楚起见,一般来说,#include 语句应该放在哪里?我一直看到它们超出了宏的范围,但我清楚地描述的场景似乎打破了这个原则。提前感谢任何帮助者!如果我犯了任何愚蠢的错误,请允许我澄清我的意图!

最佳答案

我认为“宏”是指#ifndef 包含 guard ? 如果是这样,#includes 肯定应该进去。这是包含守卫存在的主要原因之一,因为否则您很容易像您注意到的那样以无限递归结束。

无论如何,问题是在您使用 A 和 B 类(在另一个类中)时,它们还没有被声明。看看#includes 被处理后的代码是什么样子的:

//#include "A.h" start
#ifndef A_H_
#define A_H_

//#include "B.h" start
#ifndef B_H_
#define B_H_

//#include "A.h" start
#ifndef A_H_ // A_H_ is already defined, so the contents of the file are skipped at this point
#endif /*A_H_*/

//#include "A.h" end

class B
{
    private:
            A& a;

    public:
            B(A& a) : a(a) {}
 };

#endif /*B_H_*/

//#include "B.h" end

class A
{
    private:
            B b;

    public:
            A() : b(*this) {}
};

#endif /*A_H_*/
//#include "A.h" end

int main()
{
    A a;
}

现在阅读代码。 B 是编译器遇到的第一个类,它包含一个 A& 成员。 A 是什么?编译器还没有遇到任何A的定义,所以它会发出错误。

解决方法是对A进行前向声明。在B的定义之前的某个时刻,添加一行class A;

这为编译器提供了必要的信息,即 A 是一个类。我们对此一无所知,但由于 B 只需要包含对它的引用,这就足够了。在 A 的定义中,我们需要 B 类型的成员(不是引用),所以这里 B 的整个定义必须是可见的。幸运的是,它是。

关于c++ - C++ 中相互包含的 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/396084/

相关文章:

php - Wordpress-如何仅将代码插入特定页面的标题?

swift - 我想通过 Swift 实现 `curl --header $1`。(NSURLSession 的标题)

excel - 在使用 TODAY() 的条件格式化函数中排除 header

c++ - 检查 vector 索引是否为空

java - 动态规划——求公式

c++ - 递归函数参数中前后递减的区别

java - OddSum 递归练习,不知道如何求和

c++ - std::ignore 编译器错误的解释

c++ - VSOMEIP - 2 个设备之间的通信 (TCP/UDP) 不工作

c++ - std::map key 与 operator< 不匹配