【发布时间】: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