C++ 交叉引用c+中包含的标题+;程序
我对如下示例中设置的场景感到好奇: 下面是将放在名为Header1.h的文件中的代码:C++ 交叉引用c+中包含的标题+;程序,c++,class,include,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 Class
#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
我这样做时会收到错误消息(因为我假设包含),但感觉需要这样做才能将每个对象包含在单独的类中。有谁能帮我做到这一点,我做错了什么?问题是,类1的大小取决于类2,反之亦然。因此,无法计算其中任何一个的大小。向前声明一个类,并将其中一个属性更改为指针或引用:
#ifndef HEADER2_H
#define HEADER2_H
class Class1;
class Class2
{
Class1 *class1Instance;
// or
Class1 &class1Instance;
};
#endif
您拥有的是一个经典的循环引用。它在这里的堆栈溢出。只需在该线程上应用已接受的答案,同时用“struct”替换“class”,就可以了
为清晰起见进行了编辑您不能让Class2包含Class1的实例,而让Class1包含Class2的实例。您可以做的是让每个类包含一个指向其他类类型的引用或指针以及实例(带有适当的正向引用)。i、 e
这两个结构彼此无限循环——要知道
Class1
的大小,您需要知道Class2
的大小,这需要Class1
的大小,等等。解决方法是在至少一种情况下使用指针:
#ifndef HEADER1_H
#define HEADER1_H
class Class2; // no need to include Header2
class Class1
{
Class2* class2Instance;
}
#endif
文件: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
改编自我相信公认的答案正是如此。因此,将接受答案中的单词“struct”改为单词“class”,模式是相同的。请收回你毫无根据的否决票,这是一个很好的答案,但它只解决了我问题的一半。我仍然将这两个类放在两个单独的标题中。在键入include语句时,如果没有循环类包含,则只会得到一个错误。您知道如何避免这个问题而不将它们放在同一个标题中。您收到了什么错误?您发布的代码与include指令没有任何问题。那么,也许您应该给我们一个反映您当前代码的修订示例,并确切地告诉我们您遇到了哪些错误。
#ifndef HEADER1_H
#define HEADER1_H
class Class2; // no need to include Header2
class Class1
{
Class2* class2Instance;
}
#endif
#include "header2.h" // do include Header2 here, otherwise you will get errors