C++では、同じヘッダファイルに定義されているクラスの定義を複数のソースファイルに分割できますか?例えば、クラスQuad2とQuad3を定義するファイルがある場合、クラスQuad2をQuad2.cppとQuad3という名前のファイルでQuad3.cppという名前のファイルで定義できますが、どちらも同じヘッダーファイルQuad.hにありますか?同じヘッダに定義されたクラスの定義を複数のソースファイルに分割することはできますか?
これは違法と考えられますか?
C++では、同じヘッダファイルに定義されているクラスの定義を複数のソースファイルに分割できますか?例えば、クラスQuad2とQuad3を定義するファイルがある場合、クラスQuad2をQuad2.cppとQuad3という名前のファイルでQuad3.cppという名前のファイルで定義できますが、どちらも同じヘッダーファイルQuad.hにありますか?同じヘッダに定義されたクラスの定義を複数のソースファイルに分割することはできますか?
これは違法と考えられますか?
はい、別の実装ファイルで同じヘッダーファイルから異なるクラスを実装できます。
ヘッダーファイルは、コンパイル時にソースに注入されるだけのテキストコンテンツです。コンパイラ本体には、ヘッダの概念はまったくありません。コンパイラが何かを見る前に、ヘッダはプリプロセッサで解決されます。
したがって、クラスの定義と実装がどのファイルにあるかについての要件はありません。ヘッダーファイルに含まれるものと実装ファイルに含まれるものに関する規範は、ベストプラクティスとは何かと、コンパイラによって強制されるルールとは関係ありません。つまり、クラス定義をヘッダーに入れると、そのクラスの実装とそのクラスを使用したいコードの両方に簡単に挿入できるからです。
これは完全に有効です。異なるソースファイル間で関数定義を広範囲に分散することができます。リンカーは定義が見つからない場合、すべてをまとめて不平を言うでしょう。
覚えていること:#include <some_header.h>
を書くことは、その場所のソースファイルにヘッダーの完全な内容をコピーするようなものです。 Quad2.h
とQuad3.h
を両方のソースファイルQuad2.cpp
とQuad3.cpp
に含めると、両方のヘッダーを1つのファイルQuad.h
に入れて、その代わりにcpp
ファイルに含めた場合と同じ結果になります。ヘッダーファイルと実装ファイルのペアを使用することは、慣例の問題です(それは良いことです)。
ちょうどそれを試してみてください!しかし、違法ではありません。 (IMHO)人を少し混乱させるアプローチは、Quad2.hと.cpp、Quad3.hと.cppを持ち、便宜上Quad2.hとQuad3.hの両方をQuad.hに含めることです。
何もする必要はありませんが、X.cppに関連付けられているパターンX.hを維持しようとするのは一般的な方法です。
はい、完全に合法です。実際には、コードを小さなファイルに分割したい場合は、Quad2A.cppとQuad2B.cppを使用することができます(もちろん、これを行うと利点はありません)。
しかし、ソースを分離することの1つの欠点は、コンパイラーが小さな[1回だけ使用する]関数をインライン化するのが難しくなることです。ほとんどのコンパイラは、同じコンパイル単位にある関数のみをインライン展開します。したがって、Quad3.cppがQuad2.cppから何かを使用している場合、同じファイルにある場合はインライン化できますが、別のファイルにある場合はインライン化する可能性があります。しかし、これは本当にあなたのデザインにとって決定的な要素ではないはずです。単に「これを分割する」という副作用の1つとして言及してください。
1つのクラスを分割するのではなく、ファイル間で異なるクラスを実装しているようです。 –
真実ですが、同じヘッダーに定義されたクラスの定義を複数のソースファイルに分割することが許可されている方が良いと思います。ありがとう、コメントのために私は質問を更新します。 – teddy