交叉引用包含c ++程序中的头文件

时间:2009-09-15 20:04:11

标签: c++ class include

我很好奇设置了如下例子的场景:

以下是放在名为Header1.h的文件中的代码:

#ifndef HEADER1_H
#define HEADER1_H

#include "Header2.h"

class Class1
{
 Class2 class2Instance;
};

#endif

以下是放在名为Header2.h的文件中的代码:

#ifndef HEADER2_H
#define HEADER2_H

#include "Header1.h"

class Class2
{
 Class1 class1Instance;
};

#endif

我在执行此操作时收到错误消息(因为我假设包含),但感觉我需要这样做以便在每个单独的类中包含每个对象。谁能帮我解决这个问题,我做错了什么?

5 个答案:

答案 0 :(得分:32)

问题是Class1的大小取决于Class2,反之亦然。因此,没有办法计算任何一个的大小。正向声明其中一个类,并将其中一个属性更改为指针或引用:

#ifndef HEADER2_H
#define HEADER2_H

class Class1;
class Class2
{
 Class1 *class1Instance;
 // or
 Class1 &class1Instance;
};

#endif

答案 1 :(得分:8)

文件中:那么header1.h

#ifndef HEADER1_H
#define HEADER1_H

class Class2; // no need to include Header2

class Class1
{
    Class2* class2Instance;
}

#endif

文件:header1.cpp

#include "header2.h" // do include Header2 here, otherwise you will get errors

改编自here

答案 2 :(得分:3)

这两个结构无限地相互递归 - 要知道Class1的大小,您需要知道Class2的大小,这需要Class1的大小等。这是在至少一种情况下使用指针:

#ifndef HEADER1_H
#define HEADER1_H

class Class2; // no need to include Header2

class Class1
{
    Class2* class2Instance;
}

#endif

答案 3 :(得分:2)

您不能让Class2包含Class1的实例并且Class1包含Class2的实例。你可以做的是让每个类包含一个引用或指向另一个类类型的实例(具有适当的前向引用)。即。


class Class2;
class Class1
{
    Class2& class2Instance;
};

class Class1;

class Class2
{
    Class1& class1Instance;
};

答案 4 :(得分:1)

您拥有的是经典的循环参考。 Stack Overflow上有already been discussed。只需在该主题上应用接受的答案,而用“struct”代替“class”,你就是金色的。

为清晰起见而编辑