如何解析此标头包含循环

How to resolve this header include loop?

本文关键字:包含 循环 何解析      更新时间:2023-10-16

嗨,我已经阅读了有关此主题的类似问题,但我无法解决我的问题。我想我必须做一个转发声明,所以我尝试了以下内容。

我有三个类A,B和接口A

定义接口A

#ifndef INTERFACE_A_H
#define INTERFACE_A_H
#include "B.h"
namespace Example
{
  class B; // Forward declaration?
  class InterfaceA
  {
     Example::B test;
   };
}
#endif 

确定A类

#ifndef A_H
#define A_H
#include "InterfaceA.h"
namespace Example
{
  class A : public Example::InterfaceA
  {
  };
}
#endif

定义类 B

#ifndef B_H
#define B_H
#include "A.h"
namespace Example
{
  class A; // Forward declaration?
  class B
  {
     Example::A test;
  };
}
#endif

主要

#include "A.h"
#include "B.h"
int main()
{
  Example::A a;
  Example::B b;
}

我在视觉工作室中收到以下错误:

"example::B::

test"使用未定义的类"example::A"

编辑:到目前为止,感谢您的所有帮助。这是非常有帮助的。我认为我的问题是我在实际项目中的设计非常糟糕。我会改变这一点。

除此之外,我现在对转发声明有了更好的理解:-)

如果您确实需要类 A 引用类 B,反之亦然,而不是将 A 和 B 的实例作为数据成员,请考虑使用指针,例如:

// A.h
#pragma once
#include <memory> // for std::unique_ptr
// Forward declaration (A references B using pointer)
class B;
class A 
{
...
    std::unique_ptr<B> m_pB;
};

同样:

// B.h
#pragma once
#include <memory> // for std::unique_ptr
// Forward declaration (B references A using pointer)
class A
class B 
{
...
    std::unique_ptr<A> m_pA;
};


附言与您的问题的核心无关,但请注意,我使用#pragma once而不是"旧式"#ifndef/#define/#endif包括警卫; 对我来说,#pragma once似乎更简单、更清晰。

您正在创建循环依赖关系。修改您的设计。

你真的需要 B 内部的 A 类和 A 内部的 B 类实例吗?

如果它们需要共享头信息,则使它们都继承自同一个父头文件。