C++ 头文件,前向声明

C++ 头文件,前向声明,c++,forward-declaration,C++,Forward Declaration,我在编写我的项目时遇到了这个问题。 我有两个标题,每一个都有一个类,需要另一个,如下面所示 我认为这只是使用foward声明所需要的,但仍然不起作用。 我没有主意了 寻求帮助:D 标题、主错误和编译器错误如下所示: 标题1 #ifndef OBJ2_H #define OBJ2_H #include "obj1.h" class obj1; class obj2{ public: obj1 e; }; #endif // OBJ2_H 标题2 #ifndef OBJ1_H #def

我在编写我的项目时遇到了这个问题。 我有两个标题,每一个都有一个类,需要另一个,如下面所示

我认为这只是使用foward声明所需要的,但仍然不起作用。 我没有主意了

寻求帮助:D

标题、主错误和编译器错误如下所示:

标题1

#ifndef OBJ2_H
#define OBJ2_H
#include "obj1.h"
class obj1;

class obj2{
public:
    obj1 e;
};

#endif // OBJ2_H
标题2

#ifndef OBJ1_H
#define OBJ1_H
#include "obj2.h"
class obj2;

class obj1
{
    obj2 e;
};

#endif // OBJ1_H
主要

#包括
#包括“obj1.h”
#包括“obj2.h”
使用名称空间std;
int main()
{
obj1类;
obj2类2;

在这种情况下,循环依赖是没有意义的。但是如果您删除它,声明问题仍然存在。在您编写前向声明后,头文件中的原始声明将被重新声明。 实际上,前向声明用于避免将文件包含到另一个头中。因此,您只需在声明obj2之前编写
类obj1;
,并在obj2源文件(.cpp)中包含obj1.hpp。 尽管如此,只有通过引用或指针使用这些对象时,转发声明才有效

class obj1
{
    obj2 e;
};
obj2是由值组成的,所以它不会用前向声明编译。您需要删除它,只保留头包含


另外,很抱歉“声明”一词出现得太频繁了,例如对象的声明需要类或结构的完整定义。您可以通过使用指针或引用绕过它。或者通过修改您的设计,使您没有循环依赖关系。如果每个
obj1
中都有
obj2
,则反之亦然sa,你希望
obj1
有多大?无意冒犯,但是
obj1
obj2
在你写的时候都没有任何意义。如果可能的话,你写的东西都会占用无限大的内存(很抱歉搞砸了)顺便说一句,没有任何东西需要你编写这样的类,所以你需要修复你的设计,而不是强迫它。如果你解释了为什么需要这种循环依赖,我们可能会建议一种替代设计。循环依赖暗示了糟糕的代码设计
class obj1
{
    obj2 e;
};