互导入C++

互导入C++,c++,include,circular-dependency,C++,Include,Circular Dependency,我知道这是一个反复出现的问题,但到目前为止,我基本上只看到了答案“如果你有相互进口,你就做错了” 这就是为什么我更多的是一个一般性的理解问题,而不是一个与特定代码相关的问题 好吧,举个例子。假设我有一个动态自动机的数据结构。自动机的状态是具有属性“transitions”的结构。“转换”是一个动态链接列表。列表元素是以状态对象作为属性的结构 因此: 我们有state.h->transistion.h->transitionList.h->state.h-> 这显然是循环的。。。但概念上的错误在哪

我知道这是一个反复出现的问题,但到目前为止,我基本上只看到了答案“如果你有相互进口,你就做错了”

这就是为什么我更多的是一个一般性的理解问题,而不是一个与特定代码相关的问题

好吧,举个例子。假设我有一个动态自动机的数据结构。自动机的状态是具有属性“transitions”的结构。“转换”是一个动态链接列表。列表元素是以状态对象作为属性的结构

因此:

我们有state.h->transistion.h->transitionList.h->state.h->

这显然是循环的。。。但概念上的错误在哪里?从形式上看,我不认为这是一个糟糕的布局


请告诉我:

从概念上讲,这很好。它只是物理上不工作,因为C++没有物理模块系统。include指令只插入包含文件的一个副本,因此循环包含将生成无限长的源流

您需要按照编译器可以编译的特定顺序向编译器提供类,这种组合称为翻译单元

如果有一个类包含指向另一个尚未完全声明的类的指针,则必须向前声明它:

class State;

这个技巧允许类头文件不需要包含它指向指针的所有定义,并且中断循环。

这不是有效的C++代码。是的,它应该比任何东西都更伪代码。也许会有帮助。谢谢!我不知怎的认为,只有当两个类共享同一个文件时,这才有效。但这本身就阻止了嵌套导入吗?还是我仍然需要ifndef逻辑?最好用处理器前的废话包装头部,以确保多次包含的安全性,因为否则,您未来的客户端代码必须小心它包含内容的顺序。每个.h文件都有一个.cpp文件是个好主意,这样.cpp文件的第一行就包含了.h文件,即使它只包含了.h文件,因为这证明了可以首先包含.h文件,因此,测试每个头的独立可包含性。还注意到,因为C++没有物理模块系统,所以源文件之间的边界对语言来说并不重要。预处理器通过include将文件连接到单个流中,编译器不关心源代码来自何处。谢谢。我得好好考虑一下。
class State;