ヘッダー ファイルの循環依存を回避する方法について何か良いアドバイスはありますか?
もちろん、最初からプロジェクトをできる限り透明性のあるものにするように心がけています。しかし、機能やクラスがどんどん追加され、プロジェクトの透明性が低下するにつれて、循環依存関係が発生し始めます。
一般的で検証済みの作業規則はありますか? ありがとう。
ヘッダー ファイルの循環依存を回避する方法について何か良いアドバイスはありますか?
もちろん、最初からプロジェクトをできる限り透明性のあるものにするように心がけています。しかし、機能やクラスがどんどん追加され、プロジェクトの透明性が低下するにつれて、循環依存関係が発生し始めます。
一般的で検証済みの作業規則はありますか? ありがとう。
循環依存関係がある場合は、何か間違ったことをしています。
例として:
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;
...
};
そして、これは大丈夫です。
一般的なルール:
#include "myclass.h"
、最初のインクルードをにすることmyclass.cpp
です。循環依存を回避するために私が従ういくつかのベスト プラクティスは、次のとおりです。
一般的なアプローチは、2 つの元のヘッダー ファイルによって参照される 3 番目のヘッダー ファイルに共通点を抽出することです。
循環依存のベスト プラクティスも参照してください。
あなたが目指しているのは、階層化されたアプローチです。モジュールが下位層のモジュールに依存できる層を定義できますが、その逆はオブザーバーで行う必要があります。これで、レイヤーをどの程度細かくするか、レイヤー内で循環依存を受け入れるかどうかを定義できますが、この場合はこれを使用します。
プリプロセッサの機能に応じて:
#pragma once
また
#ifndef MY_HEADER_H
#define MY_HEADER_H
your header file
#endif
ヘッダー ファイルを設計するのが非常につまらないと思う場合は、 Hwaci (SQLite と化石 DVCS の設計者) の makeheaders に興味があるかもしれません。
一般に、ヘッダーファイルは、可能な限り他のヘッダーを含めるのではなく、前方に宣言する必要があります。
また、ヘッダーごとに1つのクラスに固執するようにしてください。
そうすれば、ほぼ間違いなく間違いはありません。
最悪の結合は通常、肥大化したテンプレートコードに起因します。ヘッダー内に定義を含める必要があるため、多くの場合、すべての種類のヘッダーを含める必要があります。次に、テンプレートを使用するクラスには、他のもののロードを含むテンプレートヘッダーが含まれます。
このため、私は一般的に言うでしょう:テンプレートに注意してください!理想的には、テンプレートの実装コードに何も含める必要はありません。
Artyom が最良の回答を提供しましたが、このチュートリアルも素晴らしく、いくつかの拡張機能を提供しています http://www.cplusplus.com/forum/articles/10627/