59

ヘッダー ファイルの循環依存を回避する方法について何か良いアドバイスはありますか?

もちろん、最初からプロジェクトをできる限り透明性のあるものにするように心がけています。しかし、機能やクラスがどんどん追加され、プロジェクトの透明性が低下するにつれて、循環依存関係が発生し始めます。

一般的で検証済みの作業規則はありますか? ありがとう。

4

8 に答える 8

59

循環依存関係がある場合は、何か間違ったことをしています。

例として:

foo.h
-----
class foo {
public:
   bar b;
};

bar.h
-----
class bar {
public:
   foo f;
};

おそらくあなたが望む違法です:

foo.h
-----
class bar; // forward declaration
class foo {
   ...
   bar *b;
   ...
};

bar.h
-----
class foo; // forward declaration
class bar {
   ...
   foo *f;
   ...
};

そして、これは大丈夫です。

一般的なルール:

  1. 各ヘッダーを単独で含めることができることを確認してください。
  2. 前方宣言を使用できる場合は、それらを使用してください。
于 2011-01-27T13:13:35.163 に答える
20
  • 可能な場合は前方宣言を使用してください。
  • cppファイルでのみ必要な場合は、ヘッダーインクルードをヘッダーファイルから対応するcppファイルに移動します。これを強制する最も簡単な方法は#include "myclass.h"、最初のインクルードをにすることmyclass.cppです。
  • 別々のクラス間の相互作用のポイントにインターフェースを導入すると、依存関係を減らすのに役立ちます。
于 2011-01-27T13:41:19.567 に答える
9

循環依存を回避するために私が従ういくつかのベスト プラクティスは、次のとおりです。

  1. OOAD の原則に従います。含まれるクラスが現在のクラスと合成関係にない限り、ヘッダー ファイルを含めないでください。代わりに前方宣言を使用してください。
  2. 2 つのクラスのインターフェイスとして機能する抽象クラスを設計します。そのインターフェースを介してクラスの相互作用を行います。
于 2011-01-27T14:00:19.290 に答える
7

一般的なアプローチは、2 つの元のヘッダー ファイルによって参照される 3 番目のヘッダー ファイルに共通点を抽出することです。

循環依存のベスト プラクティスも参照してください。

于 2011-01-27T13:10:29.333 に答える
4

あなたが目指しているのは、階層化されたアプローチです。モジュールが下位層のモジュールに依存できる層を定義できますが、その逆はオブザーバーで行う必要があります。これで、レイヤーをどの程度細かくするか、レイヤー内で循環依存を受け入れるかどうかを定義できますが、この場合はこれを使用します

于 2011-01-27T13:40:25.057 に答える
4

プリプロセッサの機能に応じて:

#pragma once

また

#ifndef MY_HEADER_H
#define MY_HEADER_H
your header file
#endif

ヘッダー ファイルを設計するのが非常につまらないと思う場合は、 Hwaci (SQLite と化石 DVCS の設計者) の makeheaders に興味があるかもしれません。

于 2011-01-27T13:10:18.663 に答える
3

一般に、ヘッダーファイルは、可能な限り他のヘッダーを含めるのではなく、前方に宣言する必要があります。

また、ヘッダーごとに1つのクラスに固執するようにしてください。

そうすれば、ほぼ間違いなく間違いはありません。

最悪の結合は通常、肥大化したテンプレートコードに起因します。ヘッダー内に定義を含める必要があるため、多くの場合、すべての種類のヘッダーを含める必要があります。次に、テンプレートを使用するクラスには、他のもののロードを含むテンプレートヘッダーが含まれます。

このため、私は一般的に言うでしょう:テンプレートに注意してください!理想的には、テンプレートの実装コードに何も含める必要はありません。

于 2011-01-27T13:58:52.120 に答える
2

Artyom が最良の回答を提供しましたが、このチュートリアルも素晴らしく、いくつかの拡張機能を提供しています http://www.cplusplus.com/forum/articles/10627/

于 2013-04-17T10:53:03.200 に答える