我需要相互包含两个头文件而不使用前向声明导致出现 "incomplete type" 错误

I need to include two header files to each other not using forward declaration cause get "incomplete type" error

我需要相互包含两个头文件,但我很难做到这一点。除了使用前向声明和模板来做到这一点,还有什么办法吗?或者我不允许在 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

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

这个article也处理循环依赖。

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

// SomeLogic.h
class SomeLogic
{
};

// A.h
#include "SomeLogic.h"
class A
{
    SomeLogic someLogic;
};

// B.h
#include "SomeLogic.h"
class B
{
    SomeLogic someLogic;
};

您不能将两个头文件相互包含。其中一个文件中应该有前向声明,并且必须将函数定义推送到 .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;
}