我需要相互包含两个头文件,而不是使用前向声明导致“不完整类型”错误

Posted

技术标签:

【中文标题】我需要相互包含两个头文件,而不是使用前向声明导致“不完整类型”错误【英文标题】:I need to include two header files to each other not using forward declaration cause get "incomplete type" error 【发布时间】:2018-06-04 10:04:56 【问题描述】:

我需要相互包含两个头文件,但我无法做到这一点。除了使用前向声明和模板之外,还有其他方法吗?还是我不允许在 c++ 中这样做?

这是我想做的:

// A.hpp file
#ifndef H_A_H
#define H_A_H
#include "B.hpp"
class A 
private:
  vector<B*> b;
public:
  void function() 
  // using methods of B
  
;
#endif


// B.hpp file
#ifndef H_B_H
#define H_B_H
#include "A.hpp"
class B 
private:
  vector<A*> a;
public:
  void function() 
  // using methods of A
  
;
#endif

【问题讨论】:

1) 是什么阻止您在声明B 之前转发声明A,反之亦然? 2)您应该在 .cpp 文件中定义方法,其中包含这两个标头。 您还可以创建一个C 类,该类在AB 上运行,这样AB 就不必“了解”彼此……或者可以使用std::map&lt;A, std::vector&lt;B&gt; &gt; 用于您的 A->B 映射,然后是 std::map&lt;B, std::vector&lt;A&gt; &gt; 用于您的 B->A 映射并在您的课程中摆脱 vector ......? @AlgirdasPreidžius 您提到的第二点正是我的其他问题之一。每当我在 cpp 文件中定义方法时,我都会收到“...的多重定义”错误。 @txtechhelp 谢谢你,但我认为这对我的设计来说不是一个好主意。 @shirazy 然后,您不应该:1)将所述 .cpp 文件包含到其他文件中,或 2)在标头和 .cpp 文件中定义它。 【参考方案1】:

您不能相互包含两个头文件。在其中一个文件中应该有前向声明,并且必须将函数定义推送到可以包含头文件的 .cpp 文件中。

// HeaderA.h file
#ifndef H_A_H
#define H_A_H
#include "HeaderB.h"
class A 
private:
  int b;
public:
  void function() 
  // using methods of B
      B b;
      b.function();
  
;
#endif

// HeaderB.h file
#ifndef H_B_H
#define H_B_H

class A;

class B 
private:
  int a;
public:
  void function();
;
#endif

// Main.cpp
#include "HeaderA.h"
#include "HeaderB.h"

 void B::function()
 
  // using methods of A
      A a;
      a.function();
 

int _tmain(int argc, _TCHAR* argv[])

    return 0;

【讨论】:

【参考方案2】:

你有一个循环依赖。这个answer 解释了如何通过前向声明来处理它们。

这个article 也处理循环依赖。

如果您 100% 不想使用前向声明,并且您可以将逻辑拆分到不同的类中并使用组合。

// SomeLogic.h
class SomeLogic

;

// A.h
#include "SomeLogic.h"
class A

    SomeLogic someLogic;
;

// B.h
#include "SomeLogic.h"
class B

    SomeLogic someLogic;
;

【讨论】:

以上是关于我需要相互包含两个头文件,而不是使用前向声明导致“不完整类型”错误的主要内容,如果未能解决你的问题,请参考以下文章

术语:前向声明与函数原型

类成员的前向类声明

C ++包含与前向声明策略[关闭]

在 Objective-C 中前向声明枚举

使用一个大的包含文件的优点/缺点

重构 C++ 代码以使用前向声明