2016-05-05 10 views
2

私は経験豊富なプログラマーですが、高水準言語でしかありません。私は今、私の最初の本当に大きなプロジェクトをC++でやっています。なぜ.hを含めると.cppソースも一緒に来るのですか?

私は2つのクラス、ClassAClassBを持っています。 ClassAClassBsのインデックスであるため、ClassAClassBが何であるかを知る必要があり、ClassBは何かが変更されたときにインデックスを更新できるようにする必要があります。これらのクラスはどちらも独自の.h & .cppファイルです。私は他からそれぞれ含む考え出し

はちょうど無限再帰の原因となるので、私が代わりにmain.cppの初めに#include "ClassA.cpp"#include "ClassB.cpp"を持つことにしました。これを実行すると、コンパイラはそれらのファイル内のすべてのクラスとメソッドの複数の定義について警告するようになりました。

いくつかの実験の後、私はClassA.hClassB.hを含むことが望ましい動作を生成することを発見しました - しかし、私はこれらのクラスのプロトタイプしか含んでいません。確かに実際にそれらを作るコードは混同されることはありませんか?それでも、それはそうです。

ここでは何が起こっているのですか? を含めると、ClassAの実際のコードも表示されるのはなぜですか?そして、なぜClassA.hのすべてのインクルードがヘッダーシールドやそれが呼び出されているにもかかわらず "multiple definition"エラーを発生させる原因となるのは、ClassA.cppですか?

+0

を。実際の実装は、ClassA.oとClassB.oのリンク時に解決されます。 –

+0

私はあなたの状況をよく理解していません。 'ClassA.h'と' ClassB.h'の両方をどこに入れましたか? 'main.cpp'では?また、実際のコードが表示されるのはどういう意味ですか? –

+0

C++では、#includeディレクティブは、現在のファイル内のファイル内容のコピー・ペーストのみです。通常、.cppにコンパイルされたコードをコピーするのではなく、.hファイルのみをインクルードする必要があります –

答えて

6

行方不明のステップは、これらのファイルはまた、いくつかの点でコンパイルない限りClassA.cppClassB.cppの定義は、リンカによって見られることはないだろうということです。あなたはこのような何かをした場合:

g++ main.cpp ClassA.cpp ClassB.cpp 

はその後main.cppからClassA.cppClassB.cppの定義へのすべての参照が解決されるだろう。あなただけ

g++ main.cpp 

をした場合は、その後、リンカはClassA.cppClassB.cppの定義を見つけるため見当がつかないでしょうし、あなたはおそらくエラーになるだろう。

IDEを使用している場合、この詳細はあなたから隠されています。IDEは、 "プロジェクト"に.cppファイルを追加する限り、そのファイルをビルドするときに最後のバイナリにコンパイルされます。プロジェクト。あなたは、ヘッダー以上のものを含める必要はありませんので、

あなたのクラスは、他のクラスのプロトタイプ以上のものになりましたする必要はありません。

1

これは、C++の設計方法の方法です。

これはなぜですか?まあ、アプリケーション全体のコンパイルは、コード自体のコンパイルとリンクの2つのステップの組み合わせです(実際には、前処理の前に3つ目のステップがあります:前処理ですが、コードコンパイルの一部として考慮することもできます)。

例関数呼び出し:特定のproto型の関数が存在することを知るには(例外:インライン関数!)十分です。コンパイラは関数呼び出しを行うために必要なすべてのコードを生成することができますが、関数の実際のアドレスは例外です。

リンカーは、コンパイルステップ中に生成されたすべてのコードを1つのユニットに結合します。現在、すべての機能がどこにあるのかを知っているので、実際のアドレスをどこにでも置くことができます。

1

.cppファイルごとにC++コードが*.objにコンパイルされており、objファイルを実行可能ファイルにする処理はlinkです。

* .cppは、通常、改訂の問題が発生するため、絶対に含めないでください。それぞれの* .hファイルについては

、を含む複数の避けるためにマクロを追加します。それは、クラスの定義が利用できるようになり

#ifndef XXX_H 
#define XXX_H 

//your code goes here 

#endif 
関連する問題