相互导入 C++
Mutual Import C++
我知道这是一个反复出现的问题,但到目前为止我基本上只看到了答案“如果你有相互导入你做错了什么”。
这就是为什么我有更多的一般理解问题而不是与某些特定代码相关的问题。
好吧,举个例子。假设我有一个动态自动机的数据结构。自动机的状态是具有“转换”属性的结构。 “transitions”是一个动态链表。列表元素是具有状态对象属性的结构...
所以:
// state.h
#include "transitionList.h"
State{
TransitionList transitions; // all transitions going out from this state
}
// tranistion.h
#include "state.h"
Transition{
Transition* next_transition; // the next transition in the TransitionList
State* successor; // a pointer to the next state in the automaton
}
// transitionList.h
#include "tranisiton.h"
TransitionList{
// *code* class for a linked list of transitions
}
所以我们有 state.h -> tranistion.h -> transitionList.h -> state.h -> …
这明显是循环的……但是概念错误在哪里呢?从正式的角度来看,我看不出这是一个糟糕的布局。
请赐教:)
概念上没问题。它只是在物理上行不通,因为 C++ 没有物理模块系统。 #include
指令只是插入包含文件的副本,因此循环包含将产生无限长度的源流。
您需要以编译器可以编译的特定顺序向编译器提供 classes,该组合称为 "translation unit"。
如果你有一个 class 持有指向另一个尚未完全声明的 class 的指针,你必须 "forward declare" 它:
class State;
这个技巧允许 class headers 之一不需要包含它持有指针的东西的完整定义,并打破循环。
我知道这是一个反复出现的问题,但到目前为止我基本上只看到了答案“如果你有相互导入你做错了什么”。
这就是为什么我有更多的一般理解问题而不是与某些特定代码相关的问题。
好吧,举个例子。假设我有一个动态自动机的数据结构。自动机的状态是具有“转换”属性的结构。 “transitions”是一个动态链表。列表元素是具有状态对象属性的结构...
所以:
// state.h
#include "transitionList.h"
State{
TransitionList transitions; // all transitions going out from this state
}
// tranistion.h
#include "state.h"
Transition{
Transition* next_transition; // the next transition in the TransitionList
State* successor; // a pointer to the next state in the automaton
}
// transitionList.h
#include "tranisiton.h"
TransitionList{
// *code* class for a linked list of transitions
}
所以我们有 state.h -> tranistion.h -> transitionList.h -> state.h -> …
这明显是循环的……但是概念错误在哪里呢?从正式的角度来看,我看不出这是一个糟糕的布局。
请赐教:)
概念上没问题。它只是在物理上行不通,因为 C++ 没有物理模块系统。 #include
指令只是插入包含文件的副本,因此循环包含将产生无限长度的源流。
您需要以编译器可以编译的特定顺序向编译器提供 classes,该组合称为 "translation unit"。
如果你有一个 class 持有指向另一个尚未完全声明的 class 的指针,你必须 "forward declare" 它:
class State;
这个技巧允许 class headers 之一不需要包含它持有指针的东西的完整定义,并打破循环。