2016-12-29 15 views
2

私はこの特定の答えを見つけることができませんでした.-hファイルにはクラス宣言があり、.cppファイルには実装が保持されています。クラスの宣言と実装の場所がC++で混乱しています

これは繰り返しなしでどのように行われるのか混乱します。

私がクラスのAnimalを持っていれば、それはプログラムのいくつかの領域で呼び出されるかもしれません。だから、実装を何度も書き直さなければならないように思えるでしょう(間違いなく、私は誤解されています)。

特定のクラスを使用するたびに.h宣言と.cpp暗示を含めるのはちょっとうんざりです(私は何かを誤解しているという証拠)。

私は宣言と実装を分離するというテーマでどこが間違っていますか?

私はこの時間にPHPとPythonをやっていましたので、それは私を混乱させる事前の習慣かもしれません。

+0

なぜ実装を書き直す必要がありますか?クラスを必要とするところにヘッダーを '#include'するだけです。 – melpomene

+0

#includeの目的を明確に理解する必要があります。 [ここをクリック](https://en.wikipedia.org/wiki/Include_directive)またはGoogleのボックスを使用してください... – RamblinRose

+3

これはC++のトリッキーな側面です。要約すると、少し簡略化された** "1つの定義ルール" **と呼ばれるC++には、すべてのオブジェクトファイル(C++標準の '翻訳単位'と呼ばれます)には1つの宣言しかない同じクラスに対してクラス宣言が発生した場合は、ACROSS変換ユニットは同一でなければなりません。これにより、プログラマは、クラス宣言のコードをヘッダファイルに一度書き込んで、ソースファイル全体に再利用することができます。 –

答えて

5

.cpp into object(.o)ファイルがコンパイルされます。
他の.cppファイルにはとなることはありません(一般的な例ではエラーです)。一般的にヘッダファイルをINGの#includeによって取得され

宣言は、1つの.cppファイルがいくつか.cppファイルで定義されているものを知っているし、実際にその定義をせずにそれを使用する方法です。

ファイルがすべてオブジェクトファイルにコンパイルされると、リンカはすべてのオブジェクトファイルをリンクして、最終実行ファイルまたはライブラリを形成します。
同じものが複数定義されている場合、または存在しない場合はリンカーエラーです。

+0

Animal.hからクラス 'Animal'を使って3つのcppファイルがある場合、1つのcppファイルに実装を書くだけで済みます。他2人? – Pipsqweek

+1

@Pipsqweekはい。 'Animal.cpp'は' Animal'の実装を含みます。他の3つの '.cpp'ファイルは' Animal.h'を介して 'Animal'がそのような関数やメンバなどを持つクラスであることを知ります。それから' Foo 'に気付くことで、それを一括してリンカすることです。 o'は 'Animal :: eat()'を呼びたいと思っています。これは 'Animal.o'で定義されています。 – Quentin

+0

私は今それほど感謝します。私の心の中に「私の「輸入モジュルネーム」の目」という小さな声があります。 – Pipsqweek

関連する問題