相互导入C ++

时间:2015-03-21 07:46:35

标签: c++ include circular-dependency

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

这就是为什么我有一个更普遍的理解问题,而不是一个与某些特定代码相关的问题。

好的,举个例子。假设我有一个动态自动机的数据结构。自动机的状态是具有属性“过渡”的结构。 “过渡”是一个动态链表。列表元素是具有State对象属性的结构......

所以:

// 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 - > ...

这显然是循环的......但概念错误在哪里?从正式的角度来看,我不知道这是一个糟糕的布局。

请赐教:)

1 个答案:

答案 0 :(得分:0)

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

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

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

class State;

这个技巧允许其中一个类头不需要包含它拥有指针的东西的完整定义,并打破循环。