2

.hと.cppに分離せずに.hppでコードを記述したい

  • やったよ。静的クラスフィールドの定義にのみ.cppを使用します

#includeを手動で書きたくない...

  • 可能な場合は前方遅延を使用します。
  • すべての.hppファイルには#pragmaが1回含まれています。
  • しかし、私のプロジェクトが40〜50クラスに成長すると、インクルードグラフの問題が発生しました。定義に誤りがあります。

プロジェクトモデル(mvcの一部など)のインクルードグラフが添付された画像。
私はこのアプリをグラフ生成に使用しました(MSVSがなくても動作します!)。

グラフを含める

インクルードグラフはどのように見えるべきですか?木のように?
C#やJavaのように、インクルードを手動で記述しない方法はありますか?

4

4 に答える 4

11

残念ながら、間違った言語を使用している可能性があります。クラス定義を実装から分離すると、C++の方がはるかに簡単なことがいくつかあります。前方宣言を使用しても、実装を個別のファイルに移動することによってのみ解決できる循環依存関係が発生する可能性があります。

慣用的なJavaを記述したい場合は、Javaで記述してください。残念ながら、C ++言語を使用したい場合は、その制約内で作業する必要があります。

于 2011-10-13T13:14:18.713 に答える
1

クラスごとに.hppファイルがあると仮定すると、インクルードグラフはクラス依存関係グラフに似ています。再利用性のために、クラス依存関係グラフは非循環である必要があります(これは、「分割」サイクルへのインターフェースを使用して実現できます)。したがって、インクルードグラフも非周期的である必要があると思います。

#include句については、手動で作成する必要があります。ただし、クラスが十分に小さい場合、これは問題にはなりません(クラスが非常に大きいため、必要なものが何であるかがわからない場合は、設計上の問題があります)。

于 2011-10-13T13:25:37.997 に答える
1

ちょっとしたメモとして、クラスをファイルに分割する.cpp.h、循環依存の問題が解決されるだけでなく、コンパイル時間が大幅に増加する可能性があります。

ヘッダーのみのコードを作成しようとすると、コードの一部が変更されたとしても、プロジェクトが完全に再構築される可能性があります。

ヘッダーのみのコードは、基本的にテンプレートベースのライブラリを設計している場合にのみ意味があります。これは、テンプレートがヘッダーに存在する必要があるためです。boost template libraryたとえば、を参照してください。また、テンプレートライブラリを使用する実際のアプリケーションに.cppは、コード用のファイルがまだあり、インスタンス化されたテンプレートが実際に「使用」される場所です。

于 2011-10-13T13:29:00.570 に答える
1

実装を「.cpp」ファイルに配置し、宣言またはインターフェイスをヘッダーファイル「.hpp」に配置することを強くお勧めします。

ヘッダーファイルでインライン関数が変更されると、ヘッダーファイルを含むすべてのソースファイルが再コンパイルされます。ソースファイルで関数が変更された場合、再コンパイルする必要があるのはソースファイルのみです。

インライン関数を作成する前に、コードを正しく堅牢に機能させてください。

もう1つの提案は、テーマごとにグループ化されている、または頻繁にコンパイルされない(つまり、機能し、変更されない)ソースファイルのライブラリ(オブジェクトファイルのコレクション)を作成することです。

ファイルの量やビルドプロセスの長さについて心配する必要はありません。プロジェクトを正しく、確実に、スケジュールどおりに完了することに重点を置きます。必要に応じてビルドプロセスを調整します。スケジュールに多くの時間があり、コードが正しく機能し、堅牢である場合は、変更を加えます。ビルドプロセスを変更すると、開発時間が*大幅に短縮される可能性がある場合は」、変更を加えます。

于 2011-10-13T18:16:08.837 に答える