ヘッダーファイルの循環依存関係を回避する方法について、良いアドバイスはありますか?
もちろん、最初からプロジェクトをできるだけ透明にしようとしています。ただし、より多くの機能とクラスが追加され、プロジェクトの透明性が低下すると、循環的な依存関係が発生し始めます。
一般的、検証済み、および機能するルールはありますか?ありがとう。
循環依存がある場合は、何か間違ったことをしていることになります。
例として:
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およびFossil DVCSの設計者)の makeheaders が役に立つかもしれません。
一般に、ヘッダーファイルは、可能な限り他のヘッダーを含めるのではなく、前方宣言する必要があります。
また、ヘッダーごとに1つのクラスを使用するようにしてください。
そうすれば、ほぼ間違いなく間違いはありません。
最悪のカップリングは通常、肥大化したテンプレートコードから生じます。定義をヘッダーに含める必要があるため、多くの場合、すべての種類のヘッダーを含める必要があり、テンプレートを使用するクラスには、他のものの負荷を含むテンプレートヘッダーが含まれます。
この理由から、私は一般的に言うでしょう:テンプレートに注意してください!理想的には、テンプレートの実装コードに何も含める必要はありません。
Altough Artyomは、このチュートリアルも優れた拡張機能を提供するこのチュートリアルも素晴らしい回答を提供しました http://www.cplusplus.com/forum/articles/10627/