多个循环依赖项c++; 该程序涉及一个用C++编程的铁路网络仿真。该程序由五个不同的类组成,即控制器(跟踪时间并安排新事件)、网络(将模型的不同部分一起抓取)、火车、车站和行程

多个循环依赖项c++; 该程序涉及一个用C++编程的铁路网络仿真。该程序由五个不同的类组成,即控制器(跟踪时间并安排新事件)、网络(将模型的不同部分一起抓取)、火车、车站和行程,c++,circular-dependency,C++,Circular Dependency,Trip基本上是一个节点,以站点作为起点和终点。火车取决于行程,因为火车跟踪它要去的地方。火车站有很多火车。依赖项如下图所示 我看过相关问题中提出的解决方案,但这些解决方案只涉及简单的a->B,B->a关系。下面是一些相关的代码片段 编辑:首先,编辑站点。这没有问题,但当我切换到trip时,会出现以下形式的错误: g++ --std=c++14 -Wall -g -O2 -c -o tmp/o/3train1.o train/train1.cc In file included from t

Trip基本上是一个节点,以站点作为起点和终点。火车取决于行程,因为火车跟踪它要去的地方。火车站有很多火车。依赖项如下图所示

我看过相关问题中提出的解决方案,但这些解决方案只涉及简单的a->B,B->a关系。下面是一些相关的代码片段

编辑:首先,编辑站点。这没有问题,但当我切换到trip时,会出现以下形式的错误:

g++  --std=c++14 -Wall -g -O2 -c -o tmp/o/3train1.o train/train1.cc
In file included from train/../trip/trip.h:4:0,
                 from train/train.h:6,
                 from train/train.ih:1,
                 from train/train1.cc:1:
train/../trip/../station/station.h:13:14: error: ‘Train’ was not declared in this scope
  std::vector<Train*> d_trains;
g++--std=c++14-Wall-g-O2-c-o tmp/o/3train1.o train/train1.cc
在列车/行程/行程的文件中。h:4:0,
从列车/列车h:6,
来自列车/列车。ih:1,
来自列车/列车1。抄送:1:
列车/。/行程/。/车站/车站。h:13:14:错误:“列车”未在此范围内声明
std::向量d_序列;
trip.h

#include "../station/station.h"
#include <chrono>
class Station; // forward declaration
class Trip
{
    Station &d_beginStation;
    Station &d_endStation;
    std::chrono::minutes d_durationTrip;
#包括“./station/station.h”
#包括
班级站;//远期申报
集体旅行
{
车站和d_站;
车站和杜恩德车站;
标准::计时::分钟d_持续行程;
火车

#include "../trip/trip.h"

class Train
{
    typedef std::chrono::system_clock::time_point Timepoint;

    size_t d_id;
    std::list<Trip*> &d_route;
#包括“./trip/trip.h”
班车
{
typedef std::chrono::system_clock::time_point Timepoint;
尺寸d\u id;
std::列表和d_路线;
h站

#include "../train/train.h"

class Station
{
    std::string d_name;
    std::chrono::minutes d_waitTimeStation;
    std::vector<Train*> d_trains;
#包括“./train/train.h”
班级站
{
std::字符串d_名称;
std::chrono::minutes d_waitTimeStation;
std::向量d_序列;
网络.h

#include "../train/train.h"
#include "../station/station.h"
#include "../trip/trip.h"

class Network
{
    typedef std::list<Trip> Route;

    std::list<Train *> d_trains;
    std::list<Station> d_stations;
    std::list<Route> d_routes;
#包括“./train/train.h”
#包括“./station/station.h”
#包括“./trip/trip.h”
班级网络
{
typedef std::列表路由;
std::列出d_列车;
std::列出d_站;
std::列出d_路线;

使用更多的前向声明来放松所有这些标头之间的依赖关系

当您有
站点时,您已经向前声明了
站点
;现在当您有
std::vector
时,向前声明了
列车
,依此类推


然后,您可以删除大量包含,不再存在循环依赖性问题。

那么,实际问题是什么?这不起作用吗?如果不起作用,您会遇到什么错误?您可能希望查看转发引用,请参阅:我编辑了问题,以显示实际的错误消息。我查看了它,但我只能从头开始只有两个类就可以解决这个问题。当这个问题扩展到更多的类时,我看不出这将如何工作。@Robinson:“向前声明”.References是另一回事。谢谢!这解决了问题。使用转发声明,使用转发的类现在如何知道此类的实现。这是否处于链接阶段?@bytefast:不,它仍处于编译阶段;您的.cpp文件将必须
#包含这些头。但是由于.cpp文件没有在编译过程中不能相互交互,没有冲突。而且链接器(可以同时处理所有源文件)足够聪明,可以解决相互依赖关系。因此,您基本上是在“延迟”循环依赖关系问题,直到它实际上不是问题为止。