【问题标题】:How do I create two classes that refer to each other in different header files? [duplicate]如何创建两个在不同头文件中相互引用的类? [复制]
【发布时间】:2021-12-29 03:57:06
【问题描述】:

我在两个不同的头文件中有两个类。我,正如另一个有类似问题的主题所建议的那样,在 B 类之前声明了 A 类,在 A 类之前声明了 B 类。但这没有帮助。卖家仍然看不到组织

卖家.h

#ifndef OOP_3_SELLER_H
#define OOP_3_SELLER_H
#include "Organization.h"
class Organization;
class Seller{
protected:
Organization*owner;
...
};

组织.h

#ifndef ORGANIZATION_OOP3_H
#define ORGANIZATION_OOP3_H
#include "Seller.h"
class Seller;
class Organization{
 std::vector<Seller*> own;
...
};

编译器告诉我以下错误: 错误 C2027:使用未定义的类型“组织”。也就是说,据我了解,Organization 看到了Seller,但是Seller 没有看到Srganization

【问题讨论】:

标签: c++ class compiler-errors header include


【解决方案1】:

由于您在 Seller.h 中转发了 class Organization,因此无需编写 #include "Organisation.h"。同样,在 Organization.h" 中,由于您已经转发声明 class Seller,因此无需编写 #include "Seller.h"。此外,请始终考虑 循环依赖,如您的程序 Organization.h 有一个 #include "Seller.h",然后 Seller.h 有一个 #include "Organization.h"

可以看到正在运行(编译成功)的程序here

Organization.h

#ifndef ORGANIZATION_OOP3_H
#define ORGANIZATION_OOP3_H
//#include "Seller.h"
#include <vector>
class Seller;
class Organization{
 std::vector<Seller*> own;

};
#endif

Seller.h

#ifndef OOP_3_SELLER_H
#define OOP_3_SELLER_H
//#include "Organization.h"
class Organization;
class Seller{
protected:
Organization*owner;

};
#endif

在 .cpp 文件(也称为 源文件)中,您应该使用 #include 包含标题。

您的程序也有其他问题,例如 Seller.h 中的许多(我的意思是很多)方法对于具有非 void 返回类型的方法没有返回值。

我尝试解决您 github 代码中的一些问题,但有太多问题(错误和警告)需要解决。另外我建议你也使用 cpp 文件。

【讨论】:

  • 我不太明白您所说的 cpp 文件是什么意思,但我不会使用它们。删除了包含但没有帮助。您还可以在 github.com/sabidilovskiy/OOP3 中查看所有代码
  • @MRV 如果您要认真对待 C++,那么您最好开始使用与头文件相对应的 cpp 文件。尽管在简单/小型项目中您可以跳过它们的使用,但是当项目变得更大/更大时,最好使用它们。现在您说即使删除了#includes,您仍然会收到错误消息。所以这意味着你的头文件中必须有一些其他的东西/代码,而这些东西/代码是你在原始代码 sn-ps 中没有给出/写的。您能否粘贴您现在拥有的头文件的确切代码,以便我/我们可以缩小问题范围?除非你只开发 header
  • 问题是我在СLion工作,他们在那里使用СMake。出于某种我不明白的原因,当与 cpp 和类模板一起使用时,它的效果非常糟糕。如果您将它们添加到可执行文件中(正如默认情况下 Clion 所做的那样),并且像往常一样,每个人都只包含头文件,那么它将无法编译。我通过包含 cpp 文件解决了这个问题,但这并没有长久帮助,而且单独文件的全部含义通常都丢失了。现在我将尝试拆分代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 2014-07-12
  • 2011-10-27
  • 2011-06-25
  • 2015-04-20
  • 1970-01-01
相关资源
最近更新 更多