9

前方宣言を使用し、#includes を実装ファイルに移動することで、一連のヘッダー ファイル「インクルード スパゲッティ」を簡素化しようとしています。ただし、次のシナリオに出くわします。

//Foo.h
#include "Bar.h"

class Foo
{
public:
  void someMethod(Bar::someType_t &val);
};

//Bar.h
.
.
.
class Bar
{
public:
  typedef std::vector<SomeClass> someType_t;
};

#include "Bar.h" を可能な限り削除したいと考えています。Bar.h の typedef が Bar クラスの外にリストされている状況も見られます。どちらの状況も同じ方法で対処できると思います。

何か案は?

4

2 に答える 2

8

残念ながら、選択肢は多くなく、完璧なものはありません。

まず、2つの明白で受け入れられない解決策:

  • typedefを使用する目的を完全に無効にする前方宣言を行うことができますtypedef
  • typedef避けたいを含むファイルを含めます。

より興味深い解決策:

  • typedef同じインクルードに関連するすべてのファイルを含め、そのファイルをインクルードします。ただし、これによりクラス間にコード結合が作成されます。これは、関連するクラスでのみ行う必要があります。そうしないと、最終的にgod includeファイルが作成typedefされ、そのファイルにを追加すると、多くの再コンパイルが発生する可能性があります。
  • クラスごとに、typedefsを含む個別のインクルードを用意します。ちょっと面倒ですが、うまくいきます。

これらの最後の2つは、前方宣言を行うのと似ていますが、typedefsが追加されています。typedefファイルを変更することはめったにないため、ファイルの相互依存性が減少します。

ほとんどの状況で、中央のインクルードは面倒なことに最もメリットがあります。ただ注意してください。

于 2009-05-07T19:41:15.527 に答える
-2

を使用するだけclass Bar;です。これは、Bar を定義する意図を宣言していることを C++ に伝えます。

于 2009-05-07T19:35:10.207 に答える