我很好奇设置了如下例子的场景:
以下是放在名为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
我在执行此操作时收到错误消息(因为我假设包含),但感觉我需要这样做以便在每个单独的类中包含每个对象。谁能帮我解决这个问题,我做错了什么?
答案 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”,你就是金色的。
为清晰起见而编辑