2016-04-08 24 views
0

このプログラムは、C++でプログラムされた鉄道網のシミュレーションに関係しています。プログラムは5つの異なるクラス、すなわち、コントローラ(時間を追跡し、新しいイベントをスケジュールする)、ネットワーク(モデルの異なる部分を一緒に掴む)、列車、駅および旅行からなる。複数の循環依存関係C++

トリップは基本的に、開始点と終了点としてのステーションを持つノードです。列車は行くべき場所を把握しているので、列車は旅行に依存します。駅には列車のベクトルがあります。依存関係は図のようになります。

Graph

私は関連の質問で提案された解決策を見てきましたが、これらのソリューションは、単純なA懸念 - > B、B - >関係を。以下は、コードの関連するスニペットです。

編集:まず、ステーションがコンパイルされます。これは何の問題を与えていないが、私はトリップする切り替えたとき、それは次の形式のエラーを与える:

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; 

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; 

train.h

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

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

    size_t d_id; 
    std::list<Trip*> &d_route; 

station.h

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

class Station 
{ 
    std::string d_name; 
    std::chrono::minutes d_waitTimeStation; 
    std::vector<Train*> d_trains; 

network.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; 
+0

実際の問題は何ですか?これは機能していないのですか?あなたはどんなエラーが出ていないのですか? – NathanOliver

+1

Forward Referencesを参照してください。http://stackoverflow.com/questions/4757565/c-forward-declaration – Robinson

+0

実際のエラーメッセージも表示するように質問を編集しました。私はそれを見ましたが、私はただ2つのクラスでこれを取り巻く私の頭を把握することができます。この問題がより多くのクラスに拡張されたとき、私はこれがどのように機能するかわかりません。 – bytefast

答えて

2

より多くの前方宣言を使用して、すべてのヘッダー相互依存性を緩和します。

Station&を持っている場合は、すでにStationと宣言しています。あなたがstd::vector<Train*>を持っているときには今度はTrainと宣言します。

次に、1トンのインクルードを削除することができ、サイクリック依存性の問題はもう解決されません。

+0

ありがとう!これは問題を解決しました。フォワード宣言では、フォワーディングを使用するクラスは、このクラスの実装についてどのように知っているのですか?これはリンク段階にありますか? – bytefast

+0

@bytefast:いいえ、まだコンパイル段階です。あなたの.cppファイルはそれらのヘッダーを '#include 'する必要があります。しかし、.cppファイルはコンパイル時に相互に作用しないので、競合はありません。リンカー(すべてのソースファイルを一緒に扱う)は、相互依存関係を解決するのに十分なほど巧妙です。つまり、実際には問題にならない限り、循環的依存関係の問題を基本的に「遅延」させています。 –

関連する問題