当前位置:  开发笔记 > 编程语言 > 正文

在C++中包含彼此的标题

如何解决《在C++中包含彼此的标题》经验,为你挑选了2个好方法。

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

#ifndef A_H_
#define A_H_

#include "B.h"

class A
{
    private:
        B b;

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

#endif /*A_H_*/

BH

#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语句应该去哪里?我一直看到它们超出了宏,但我清楚描述的场景似乎打破了这个原则.感谢任何帮助提前!如果我犯了任何愚蠢的错误,请允许我澄清我的意图!



1> jalf..:

通过"宏",我认为你的意思是#ifndef包括守卫?如果是这样,#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的整个定义必须是可见的.幸运的是,它是哪个.



2> Konrad Rudol..:

一般来说,#include语句应该去哪里?

因为你提到的原因,在包括警卫内部.

对于你的另一个问题:你需要向前声明至少一个类,例如:

#ifndef B_H_
#define B_H_

// Instead of this:
//#include "A.h"

class A;

class B
{
    private:
            A& a;

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

#endif /*B_H_*/

这只适用于声明:只要你真正使用了一个实例A,你就需要定义它.

顺便说一句,Nathan说的是真的:你不能递归地将类实例放在彼此之间.这仅适用于实例的指针(或者,在您的情况下,引用).

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有