我正在编写我的项目,我遇到了这个问题。 我有2个标题,每个标题都有一个类,需要另一个标题,如下所示。
我认为这只需要使用foward声明,但仍然无法正常工作。 我没有想法。
寻求帮助:D
下面列出了Headers,Main和编译器错误:
标题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
主要
#include <iostream>
#include "obj1.h"
#include "obj2.h"
using namespace std;
int main()
{
obj1 class1;
obj2 class2;
cout << "Hello world!" << endl;
return 0;
}
错误:
答案 0 :(得分:2)
在这种情况下,循环依赖没有意义。但如果你删除它,声明问题仍然存在。在您编写转发声明后,头文件中的原始声明正在重新声明。
实际上,前向声明用于避免将文件包含到另一个标头中。所以你只需要在声明obj2之前编写class obj1;
并在obj2源文件(.cpp)中包含obj1.hpp。
但是,只有通过引用或指针使用这些对象时,前向声明才有效。在你的代码中
class obj1
{
obj2 e;
};
obj2由值组成,因此不会使用前向声明进行编译。您需要将其删除并仅保留标题包含。
P.S。抱歉&#39;声明&#39;经常出现的词