2016-04-06 13 views
5

私は大きくなるようになっているC++プロジェクトを持っています。私は循環依存関係を持つクラスがたくさんある状況に直面しています。C++は循環依存関係を解決するためのヘッダを作成していますか?

class A; 
class B; 
class C; 
class D; 

この:私はcircular_dep.h

このファイルの内容は、クラスへのポインタだろうという名前のヘッダファイルを作成しました、私はこの問題を解決するには、クラスA、B、C、Dを持っていると仮定ヘッダーは今すべてのクラスのヘッダーに含まれています。そうすれば、コンパイラは循環依存性を持っていると不平を言った。しかし、プロジェクトに新しいクラスを追加するときは、に追加する必要があります。circular_dep.h

私はこれを行う簡単な方法が見つかりませんでしたので、これは最高のソリューションです遠い私の質問は:循環依存問題に直面する可能性のあるプロジェクトに適用することをお勧めしますか?またはこれは悪い設計/悪いまたは危険な練習ですか?

+0

循環参照が最良のすべて一緒に避けられます。最初にコードを必要としないようにコードを再構成する方法を尋ねる方がよいかもしれません。また、表示しているヘッダファイルには、クラスの*ポインタ*が含まれていませんが、(前方に)*宣言されています。 – 5gon12eder

+3

私の好みは、個々のクラスがそれらを必要とするヘッダーに前方参照を持つようにすることです。しかしそれは単なる好みです。すべてを1つのヘッダーに入れない理由の1つは、クラスを追加するときにすべてを再コンパイルする必要がないようにすることです。 –

+0

私の頭には、いくつかのケースが避けられない場合があります。たとえば、Cのような単純な言語用のコンパイラを作成しています。関数にはブロックがあります( '{'と '}'の間には何もありません)。ブロックには変数宣言とコマンド( 'if'など)があり、コマンドにはブロック( 'if'にブロックがある可能性があります)があります。したがって、私たちはコマンドとブロックの間に巡回控除問題を持っています – Aleksandrus

答えて

2

あなたが持っているものは大丈夫です。私が通常見てきた名前の接尾辞は、_fwd.h/_fwd.hpp/_fwd.hxx、または.hのようなものが好きです。これはBoostで見ることができます(例:optional_fwd.hpp)。

(もちろん、円形の依存を減らすことは良い目標ですが、あなたは選択の余地を持っていないので、いくつかのものは、文法のような、自然の中で相互に再帰的です。)

関連する問題