头文件,foward声明

时间:2018-01-10 12:54:41

标签: c++ forward-declaration

我正在编写我的项目,我遇到了这个问题。 我有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;
}

错误:

  • include \ obj2.h | 8 |错误:字段'e'的类型不完整'obj1'|
  • include \ obj1.h | 8 | error:字段'e'的类型不完整'obj2'|

1 个答案:

答案 0 :(得分:2)

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

class obj1
{
    obj2 e;
};

obj2由值组成,因此不会使用前向声明进行编译。您需要将其删除并仅保留标题包含。

P.S。抱歉&#39;声明&#39;经常出现的词