#pragma twice

KAB-studio > プログラミング > #pragma twice > 328 Version 16.01 クラスを作ってみよう!

#pragma twice 328 Version 16.01 クラスを作ってみよう!

前のページへ 表紙・目次へ 次のページへ

 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 メンバ変数とメンバ関数 >
『につづく!』
「何となくじゃ解決できないプログラムもいっぱいあるから」
『そんなマニアックなのやだー』
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。