【问题标题】:Recursion in includes (file 1 includes file 2 that includes file1)包含中的递归(文件 1 包含包含文件 1 的文件 2)
【发布时间】:2020-07-30 10:30:32
【问题描述】:

我一直在环顾四周,但没有找到任何真正帮助我解决此问题的问题。我不是很有经验,所以也许这个问题是微不足道的,这是我缺乏知识的问题。

我正在尝试解决一个问题。我们的系统有一个 Logger,它接收不同的日志并将它们放入 SharedMemory

但是,在我们的一个课程(StateMachine)中,由于递归,我无法使用Loogger

  • Logger.h 包括SharedMemory.h

  • SharedMemory.h 包括StateMachine.h

如果我在StateMachine.h 中包含Logger.h,编译错误会到处出现。首先,我试图通过创建第二个SharedMemory 来解决这个问题,该Logger 专用于Logger,不包括StateMachine.h

通过这种方法,编译错误得到了解决,但是我的经理不喜欢这种设计方案。

我也尝试更改包含顺序,并在包含之前声明类,但它不起作用(例如,声明 class SharedMachine;在 #include SharedMachine.h 之前)

包含是这样的:

在 StateMachine.h 中

#ifndef SM_H

#define SM_H

#include <map> 

/* (different includes) */

#include Logger.h

在 Logger.h 中

#include SharedMemory.h

在 SharedMemory.h 中

#include StateMachine.h

我想知道是否有任何技巧可以使包含以这种方式工作,而无需更改架构(我的经理似乎不喜欢)。

【问题讨论】:

  • 使用前向声明代替包括整个文件(what is forward declarations)
  • 您要搜索的术语是“前向声明”和“循环依赖”
  • 问题的核心在于这些标题。为什么你认为你需要包括他们?依赖于记录器的东西不可能被记录器依赖。依赖树中不能有循环。
  • ´非常感谢您的回答,我试图在 State_Machine 中创建一个转发声明,在那里写下 Logger 的定义,但随后给我带来了重新定义错误。此外,我所有的头文件中都有头文件保护,所以我认为这不是问题。我现在正在阅读有关“循环依赖”的问题,也许会有一些东西

标签: c++ logging header-files


【解决方案1】:
  1. 尝试将包含从头文件移动到源 (*.cpp) 文件
  2. 使用前向声明:What are forward declarations in C++?
  3. 更改接口以使用指针或对所需类型的引用而不是使用实际类型,以便使用前向声明(如果需要)

【讨论】:

  • 非常感谢,似乎正如您所说,如果我将包含在 *.cpp 文件中,一切正常!我刚刚将#include Logger/logger.h 移动到 State_Machine.cpp 并且它正在工作
猜你喜欢
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 2012-02-13
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
相关资源
最近更新 更多