質問: C++を勉強しだしてまだ1日位しかたっていません。 javaはある程度勉強してオブジェクト指向は触ったことがあります。 C++でクラスを宣言してプロトタイプ宣言だとかフィールドを入れてその後ソースファイルで定義して別の ソースファイルでプロトタイプ宣言のヘッダをincludeすると実行できるようなのですが、定義が書かれていないヘッダをincludeしてなんで使えるようになるんですか? includeして使えるようになる回答は"回答またはこのことについて勉強できるような用語"をお願いします。 実際ヘッダをincludeして実行したらエラーが出ました。 現在学習しているサイトのソースを入れても同じようなエラー文で失敗になりました。 ``` //calc.h #ifndef _CALC_H_ #define _CALC_H_ class calc{ private: int a; int b; public: int add(int a,int b); int sub(int a,int b); void set(int a,int b); }; #endif ``` ``` //calc.cpp #include "calc.h" int calc::add(int a,int b){ return a+b; } int calc::sub(int a,int b){ return a-b; } void calc::set(int a1,int b2){ a=a1; b=b2; } ``` ``` #include #include "calc.h" using namespace std; int main(void){ calc Cl; int a=4; int b=5; int ans=0; ans=Cl.add(a,b); cout<
回答: 実装ファイルがコンパイルされていないからです。 ``` g++ -g -O0 -o main main.cpp calc.cpp -Wall ``` ついでにWallオプションも付けて、警告を敏感に出すようにしています。 > > 定義が書かれていないヘッダをincludeしてなんで使えるようになるんですか? > > > C/C++をビルドする際、次のような手順に大別されます。 * **プリプロセス** マクロを処理する過程です。 * **コンパイル** 文法上のエラーを見つつ、オブジェクトファイルを作ります。 その際、コンパイラはヘッダなどの情報を、言うなれば『盲信』します。 * **リンク** オブジェクトファイルやライブラリを結び付ける処理です。 ご提示のコマンドでは、calc.cppのオブジェクトファイルが作られていません。 ですので、コンパイルは通っていますが**リンクエラー**を引き起こしています。