Version 16.01
クラスを作ってみよう!
「さて、 Version 16 ではクラスについてちゃんと説明していきます」
『これまでにもなんとなく教わってきたけど、ちゃんとって初めてかも?』
「 Version 11.16 ( No.216 ) とかに説明したけど、あの時は CString を
理解するための解説だったから、またちょっと違うかも」
『うん、あのときもちゃんとは教わってない気がする』
「というわけで、一からちゃんと説明します」
『はーい』
「まず Version 8.01 ( No.143 ) で作った一番シンプルなプロジェクトを
用意します」
『ほい。プロジェクト名は?』
「普通に ClassTest で」
『んで【Win32 Application】にして、【OK】ボタンっと。プロジェクトは
【空のプロジェクト】でいいんだよね』
「うんそれで。プロジェクトができたら、メニューの【ファイル】-
【新規作成】で【ファイル】ページの【C++ ソースファイル】を選んで、
【ファイル名】を Main.cpp にして」
『なんだ、 BuildTest と同じじゃん』
「ま、そうなんだけどね。さらに同じく、 Main.cpp のプログラムはこんな
感じに」
// Main.cpp
#include <Windows.h>
int WINAPI WinMain
( HINSTANCE p_hInstance
, HINSTANCE p_hPrevInstance
, LPSTR p_pchCmdLine
, int p_iCmdShow
)
{
OutputDebugString( "テスト。\n" );
return 0;
}
『ビルドして実行、ん、〈テスト。〉って出たよ。確認おけー』
「それでは、まずは一番単純なクラスを作ります」
『ほい』
「メニューの【ファイル】-【新規作成】で、【ファイル】ページの
【C/C++ ヘッダー ファイル】を選んで、【ファイル名】を Data.h にし
て」
『 Data.h っと。ファイルできたよ』
「そうしたら以下のように書いて」
// Data.h
// CDataクラス。
class CData
{
};
『お、クラスだ』
「まったく何の機能もないクラスです。クラスは、ヘッダーファイルで以下
のように定義します」
class クラス名
{
// クラスの中身
};
「最後のセミコロンを忘れないようにね」
『質問!』
「はい火美ちゃん」
『クラス名って〈Cなんたら〉じゃなきゃいけないの?』
「いけなくはないよ。そういうルールじゃないクラス名も多いし。 MFC が
この命名規則だから、っていうのが理由かな」
『 MFC ……』
「実際、この辺はそこまで合わせる必要もないのかもしれないけどね。
ヘッダーファイル名も MFC に合わせて、 C を取ったものにしてるし」
『ま、慣れてるからいいんだけどね』
「さて、クラスは【型】なので、このクラスの変数を宣言することができま
す。そこで、 Main.cpp の方を以下のように書き換えてください」
// Main.cpp
#include <Windows.h>
#include "Data.h"
int WINAPI WinMain
( HINSTANCE p_hInstance
, HINSTANCE p_hPrevInstance
, LPSTR p_pchCmdLine
, int p_iCmdShow
)
{
// CDataクラスの変数を宣言します。
CData cData;
return 0;
}
「 CData クラスを使うためには、まずそのクラスの定義がある
ヘッダーファイルをインクルードします」
#include "Data.h"
「インクルードしたら、もう変数の型として使えるので、変数宣言をしてみ
ます」
// CDataクラスの変数を宣言します。
CData cData;
『フツーの変数ね』
「でもこれが基本。クラスはあくまで〈変数の型〉。変数を作るのが目的だ
からね」
『質問!』
「はい火美ちゃん」
『ヘッダーファイルでインクルードするんなら、 WinMain() の上に CData
のがあってもいいんだよね。こんな感じに』
// Main.cpp
#include <Windows.h>
// CDataクラス。
class CData
{
};
int WINAPI WinMain
( HINSTANCE p_hInstance
, HINSTANCE p_hPrevInstance
, LPSTR p_pchCmdLine
, int p_iCmdShow
)
{
// CDataクラスの変数を宣言します。
CData cData;
return 0;
}
「そうなんだけどね。このあたりはルールかな。クラス毎にファイルを分け
た方が分かりやすいしね」
『ま、そりゃそうね』
「でもこういうことは大事かな。そこを押さえておかないと、クラスは
ヘッダーファイルに置かなきゃいけない、って思ったりするから」
『それはそれで分かりやすそうだけど……』
「プリコンパイル済みヘッダーファイルとか、相互インクルードの問題を
解決しなきゃいけないからちゃんと理解してないとだめ」
『ぶー』
「さて、最後に次回の準備をします。 CData クラスに m_iValue
メンバ変数を宣言します」
// Data.h
// CDataクラス。
class CData
{
public:
int m_iValue;
};
「メンバ変数は、クラスの中に入っている変数です。使用例はこんな感じ」
// Main.cpp
#include <Windows.h>
#include <stdio.h>
#include "Data.h"
int WINAPI WinMain
( HINSTANCE p_hInstance
, HINSTANCE p_hPrevInstance
, LPSTR p_pchCmdLine
, int p_iCmdShow
)
{
// CDataクラスの変数を宣言します。
CData cData;
// m_iValueに値を入れます。
cData.m_iValue = 100;
// 出力します。
char pch[256];
sprintf( pch, "%d\n", cData.m_iValue );
OutputDebugString( pch );
// 100
return 0;
}
「メンバ変数は、〈変数.メンバ変数〉という形でアクセスできます」
// m_iValueに値を入れます。
cData.m_iValue = 100;
『 cData の中に m_iValue が入ってる、って感じでいいんだよね』
「そういうこと。 int 型とかだとサイズが決まってるけど、クラスは
メンバ変数のサイズだけ大きくなる、って考えるのがいいかな」
『見た目とはウラハラに、クラスっておっきいってことね』
/*
Preview Next Story!
*/
『この辺はなんとなく分かってたとこかな』
「でもそれじゃいけないんだよね」
『どゆこと?』
「ちゃんと細かい所まで知らないと、プログラムは組めないよ」
『何となくじゃダメ?』
「というわけで次回」
< Version 16.02 メンバ変数とメンバ関数 >
『につづく!』
「何となくじゃ解決できないプログラムもいっぱいあるから」
『そんなマニアックなのやだー』