Version 2.12
ソースファイルとヘッダーファイル
「まず、このプログラムを試してみて」
void CCalcDlg::OnBEqual()
{
Test();
}
void Test()
{
}
『ん? いつものの……順序が逆だね』
「そういうこと」
『じゃ、ビルドして……あ、エラー。これってつまり、関数を使う前に、関
数がなきゃいけないってこと?』
「そうでもあるし、そうじゃないってことも言えるかな」
『どーゆーこと?』
「Test(); って関数を呼びだしてる部分。このとき必要なのは、関数そのも
のじゃなくて、〈どうやって関数を呼び出すか〉、つまり引数とか戻り値が
必要なの」
『それってつまり?』
「つまり、これなら大丈夫ってこと」
void Test(); //宣言。
void CCalcDlg::OnBEqual()
{
Test();
}
void Test() //定義。
{
}
「まず、これまで言ってきた関数は、ホントは〈関数の定義〉っていいま
す」
『ていぎ?』
「そ。これが、いわば関数の本体。で、この関数をどこからでも呼び出せる
ように、関数名と引数、戻り値を一緒にして張り出しておいたもの、それが
〈関数の宣言〉」
『せんげん……』
「つまり〈こーゆー関数があるぞー!! だから使え!〉って宣言してるわ
け」
『はー、なるほど。でもさ、宣言だけしといて、中身……定義だっけ、これ
がなかったら?』
「エラーが出るから」
『あ、ホントだ』
「まず〈関数は宣言と定義で1セット〉って憶えるように」
『え〜、めんどくない? だって、定義の引数とか変えたら、宣言も変えな
きゃいけないんでしょ?』
「そうなんだけど、〈他の関数〉を使う時のための前知識ってことで」
『あっ、そっか』
「で、〈関数宣言〉は、通常〈ヘッダーファイル〉に置きます」
『ヘッダーファイル? 前にちょっと出てきたね』
「今開いてるファイルの一番上は、こんなふうになってるでしょ」
#include "stdafx.h"
#include "Calc.h"
#include "CalcDlg.h"
「この拡張子が .h のファイルが〈ヘッダーファイル〉。#include って命
令で、ヘッダーファイルを〈インクルード〉しています」
『???』
「えっとまず、関数宣言。これは、ヘッダーファイルに入ってます」
『うんうん』
「で、ある関数を使いたい! そういうときは、その関数の宣言が入ってい
るヘッダーファイルを探します」
『うんうん』
「そしたらこの #include の命令でヘッダーファイルを指定します。そうす
ると、自動的に関数が使えるようになるのです!」
『おお!』
「これを〈ヘッダーファイルをインクルードする〉といいます」
『でもまだよく分かんない』
「自分でやってみれば分かるから。えっと、今見てるファイルは
CalcDlg.cpp でしょ」
『うん、タイトルバーにそう書いてあるから、そうでしょ』
「この拡張子が .cpp のファイルを〈ソースファイル〉って言います」
『ソースってウスターとかブルドックとかの?』
「いや、それとは別物。〈ニュースソース〉と同じかな。ん、でもその辺は
あんま考えない方がいいかも」
『いい例が浮かばないだけなんじゃない?』
「ぎく。えっと、とりあえず〈ヘッダーファイルに関数宣言〉が入ってて、
〈ソースファイルに関数定義〉が入ってるって憶えればいいかな」
『えっと、どっちがどっちだっけ』
「宣言宣言」
『あ、オレを使ってくれ! だよね』
「そうそう。で、たいがいこれはペアになってます。宣言と定義がペアなよ
うに、ヘッダーとソースもペア」
『ってことは、 CalcDlg.cpp があれば CalcDlg.h もある……あ、そういえ
ばインクルードしてるね』
「そう。というわけで、 Test() の宣言を CalcDlg.h に書いてみましょう。
CalcDlg.h を開いてみて」
『あ、前にそんなのやったね……えっと、どう見るんだっけ』
「あとあとを考えると、【表示】−【ワークスペース】を表示して」
エディタが少し狭まり、空いた空間に【ワークスペース】ウィンドウが表
示される。
「その【FileView】のページを表示して」
そのページにはファイルがツリー表示されている。
『この【Header Files】の中からをダブルクリックすればいい
んだよね』
ダブルクリックして CalcDlg.h をエディタに表示する。
『ううっ、何書いてあんのかわかんない……』
「とりあえず、こう書かれてる行を探してみて」
#endif // _MSC_VER > 1000
『うん、あったよ』
「その下をリターンキー押しまくって、スペースを作っちゃって」
『て、てきとー……』
「じゃ、そこに Test() の宣言を書いちゃいましょう」
『はーい。コピー』
「あ、宣言はひとつだけじゃないとダメだから、カット&ペーストね」
『あ、そういえばそうかもね』
#endif // _MSC_VER > 1000
void Test(); //宣言部。
『ビルドして実行! うん、うまくいったよ』
「定義と宣言のペア、ソースとヘッダーのペア、憶えた?」
『うん、大丈夫でしょ。ソースファイルの CalcDlg.cpp で Test() を使い
たい、そこで Test() の宣言がある CalcDlg.h をインクルードしてる、
ってことだよね。……順序逆だけど』
「ま、そういうことだね。では問題」
『げげ!』
「いつも使ってるこの関数」
void CCalcDlg::OnBEqual()
{
}
『もしかして、この関数の宣言はどこ、とか?』
「そゆこと」
『ん〜……えっとまず、セオリーでいけば、 CalcDlg.h の中にあるわけだ
けど……ん〜……あ、あっ!……違うか……』
「ん?」
『あのさ、これ、似てるけど違うよね』
afx_msg void OnBEqual();
「はい正解」
『え、そうなの?』
「そうなんです。と、種明かしの前に〈クラス〉について簡単に説明しま
しょう」
『くらす? 教室とかの?』
「うん、そんな感じかも。 CalcDlg.h の中に、こういうのがあるでしょ」
class CCalcDlg : public CDialog
{
// 略。
};
『あ、これってどっかで……』
「これと見比べてみればわかるでしょ」
void CCalcDlg::OnBEqual()
{
}
『あ! CCalcDlg っていうの、同じ!』
「そう。 CCalcDlg っていうのは〈クラス〉のひとつ。クラスは言ってみれ
ば、グループみたいなもの。だから、 Test() から CCalcDlg::OnBEqual()
は呼び出せないんだよ」
『え、ホント!?』
void Test()
{
CCalcDlg::OnBEqual();
}
『ホントだ、エラー出ちゃった』
「Test() はどこからでも呼び出せるフツーの関数だけど、 OnBEqual() は
CCalcDlg のクラスに属する〈メンバ関数〉だから、簡単には呼び出せない
わけ」
『こういうのをメンバ関数っていうんだ。メンバってラーメンに入ってる』
「そりゃメンマや! メンバーの方が分かりやすいかな」
『あ、クラスのメンバーの、関数ってことね』
「そういうこと。でもまだよく分かんないでしょ」
『だったら試す、でしょ?』
「そゆこと。というわけで、 Test() を CCalcDlg のメンバ関数にしちゃい
ましょう」
『おー』
「まず定義をこんなふうに書き換えます」
void CCalcDlg::Test() //定義部。
{
}
『あ、CCalcDlg:: が〈 CCalcDlg クラスのメンバ関数だよ〉って印?』
「そういうこと。次に、宣言を CCalcDlg の中に入れちゃいましょう」
『入れるって?』
「こんな感じかな」
class CCalcDlg : public CDialog
{
void Test();
// 略。
};
『あ、こういう意味の〈中〉、ね』
「これで Test() は、晴れて CCalcDlg のメンバ関数になりました!」
『え、もう?』
「試しに」
void CCalcDlg::Test()
{
CCalcDlg::OnBEqual();
}
『ビルドっと。あ、成功! すごーい!』
「でも実行しちゃダメ」
『なんで?』
「だって、 OnBEqual() と Test() で呼び合い続けて、ずーと終わらないで
しょ」
『あ、そーゆーもんなんだ』
「さて、今回は〈宣言と定義〉について見てきました」
『タイトルはソースファイルとヘッダーファイルだし、クラスってのとかメ
ンバ関数ってのも見たしね』
「宣言と定義が1セットで、宣言がヘッダーに、定義がソースに入ってるっ
てこと、忘れないようにね」
『宣言は〈関数使え!〉ってヤツ、定義が本体、ね』
「じゃ、最後にこれ」
void Test()
{
MessageBox( "あいうえお" ); //これが……。
}
void CCalcDlg::OnBEqual()
{
Test();
}
『あれ、なんか元に戻ったって感じ』
「そ。ただの関数、それを呼び出してるだけ。でも……」
『あれ、ビルドするとエラーだよ?』
「というわけでつづく!」
/*
Preview Next Story!
*/
「ソースのいい例、なんかないかな」
『でも雰囲気的には似てるよね』
「実は、今辞書引くまで別物って知らなかったり」
『なさけなー』
「う〜」
『というわけで次回』
< Version 2.13 いろんな関数! >
「につづく!!」
『ニュースソースは news source で、トマトソースは tomato sauce ね』
「そうっす」
『びし!』
「はう!」