【问题标题】:Header files, foward declaration头文件,前向声明
【发布时间】:2018-01-10 12:54:41
【问题描述】:

我正在编写我的项目,我遇到了这个问题。 我有 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|错误:字段“e”的类型“obj2”不完整|

【问题讨论】:

  • objectsinstance 的声明需要类或结构的完整定义。您可以使用指针或引用绕过它。或者通过修改您的设计,使您没有循环依赖。
  • 如果每个obj1 里面都有一个obj2,反之亦然,你期望obj1 有多大?
  • 无意冒犯,但obj1obj2 在您编写时都没有任何意义。如果有可能你写的东西他们都会使用无限量的内存(对不起剧透)
  • 顺便说一句,没有什么需要你编写这样的类,所以你需要修复你的设计,而不是试图以某种方式强制它
  • 如果您解释了为什么需要这种循环依赖,我们可能会建议另一种设计。循环依赖暗示糟糕的代码设计

标签: c++ forward-declaration


【解决方案1】:

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

class obj1
{
    obj2 e;
};

obj2 是由值组成的,所以它不会用前向声明编译。您需要删除它并只保留标题包含。

附:抱歉,“声明”这个词出现得太频繁了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多