#pragma twice

KAB-studio > プログラミング > #pragma twice > 216 Version 11.16 簡単なクラスを作ってみよう!

#pragma twice 216 Version 11.16 簡単なクラスを作ってみよう!

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

 Version 11.16
簡単なクラスを作ってみよう!

「前回、 CString の文字列を操作するのには = や += が使えるって説明し
ました」
『ってゆーか、それって前に教わってるよね』
「そう、演算子のオーバーロードっていいます。 Version 5.22 ( No.087 ) 
や Version 7.09 ( No.129 ) で説明してるよね」
『ちょっと駆け足だったけど』
「というわけで、ここで簡単にクラスを作って、どういう仕組みで動いてる
のか試してみようと思います」
『……クラスを作る? 作れるの?』
「もちろん。そろそろ火美ちゃんも簡単なクラスは作れるようになった方が
いいから。簡単なものだけだけどね」
『いきなり難しいのなんて作れないし』
「もちろん。とりあえず簡単なのから。まずは、まったくなんの機能もない
クラス」

// 何もないクラス。
class CNon
{
};

『えらいシンプルね』
「見方としては」

class クラス名
{
    // この中にクラスの機能が入ります。
};

「って感じ」
『クラス名って好きなのにしていいの?』
「他とかぶらなければね。あ、でも、一応最初に C ってつけた方がいいか
な。まぁ僕のスタイルだけど」
『 MFC はそうなってるよね』
「うん、それに慣れちゃってるからね。逆に、 MFC と区別するために C を
付けないいうのもありかな」
『なるほどね』
「次に、この中にメンバ変数を入れます」

// public なメンバ変数を持つクラス。
class CHasMember
{
public:
    int m_iData;
};

「これは、こういう風に使えます」

void Use_CHasMember()
{
    CHasMember cHasMember;
    cHasMember.m_iData = 100;
    TRACE( "%d\n", cHasMember.m_iData );
    // 100
}

『なんか見た目が構造体っぽいね』
「というよりまさにそんな感じかな。 Version 7.07 ( No.127 ) でやった
でしょ」
『そっか、構造体とクラスってほとんど同じなんだもんね』
「だからこういう使い方もできるんだけど……実は、これは悪い例」
『え? だって構造体はこれでいいんでしょ?』
「構造体は昔の方式だから、仕方ないっていうか……。基本的に、変数へは
できる限り直接アクセスしない方がいいんです」
『直接じゃないってことは?』
「関数を通してアクセスするってこと。こんな感じに」

// メンバ関数を持つクラス。
class CHasMemberFunction
{
private:
    int m_iData;

public:
    // 値を返します。
    int GetData() const
    {
        return m_iData;
    }

    // 値をセットします。
    void SetData( int p_i )
    {
        m_iData = p_i;
    }
};

「こんなふうに、 m_iData に値を取り出すするメンバ関数 GetData() と、
値をセットするメンバ関数 SetData() を用意して」

void Use_CHasMemberFunction()
{
    CHasMemberFunction cHasMemberFunction;
    cHasMemberFunction.SetData( 100 );
    TRACE( "%d\n", cHasMemberFunction.GetData() );
    // 100
}

「っていう感じに使います」
『なんかめんどくさい……これのメリットって?』
「まず、メンバ関数を挟む事でそこにブレークポイントを入れたり 
TRACE() を入れたりできます」
『あ、そっか、変数直接だとそれはできないね』
「どこからアクセスされても、必ずこのメンバ関数は通るから、そこで待ち
かまえておけばどこから呼ばれたかもわかるしね。それに、値を変えたり
チェックしたりもできるから」
『チェック?』
「たとえばマイナスは不可にしたりとか」
『なるほど』
「間に何か挟む事で自由度が高くなるから。で、重要なことがもうひとつ。
private とか public って付いてるでしょ」
『うん、ついてる。つか、さっきは public だけで m_iData の前にあった
のに、今度はそれが private になってて、メンバ関数の前に public が付
いてる』
「そう、そこが重要。ちょっとこれをビルドしてみて」

void Use_CHasMemberFunction_Error()
{
    CHasMemberFunction cHasMemberFunction;
    cHasMemberFunction.m_iData = 100;
}

『げ、コンパイルエラー!』

error C2248: 'm_iData' : private メンバ 
    (クラス 'B1::CHasMemberFunction' で宣言されている)に
    アクセスできません。

「実は、 private が付いてると、外からアクセスできなくなるんです。逆
に public が付いてると外からアクセスできるようになります」
『ってことは、さっき』

    cHasMember.m_iData = 100;

『ができたのは、 public が付いてたからで、それができなくなったのは 
private が付いてるから?』
「そういうこと」
『あれ? でもそれじゃ、 SetData() は外から呼べないはずじゃん』
「あ、 private や public はメンバ変数やメンバ関数ひとつひとつに対応
してるんじゃなくて、範囲で指定するんです。こんな感じに」

class CHasMemberFunction
{
private:
    // この中のメンバは private になります。
    // だから外からアクセスできません。

public:
    // public が出てきたので private は無効に。
    // この中のメンバは public になります。
    // だから外からアクセスできます。

    // public の範囲はここまで。
};

「っていうふうに、 private や public は、付けたら他のが出てくるまで
ずっと private だったり public だったりします」
『 public の範囲はここまで、ってあるってことは、クラスの中だけしか効
果がないのね』
「そういうこと。あと、何も付けてないと private になります」

class CHasMemberFunction
{
    // ここは private 。
public:
    // ここから public 。
// 以下略。

『ってことは最初の private っていらないんじゃない?』
「そうすることもできるんだけど、わかりにくいからつけた方がいいかも。
〈何も付いてない時には private 〉って憶えるのも面倒だし」
『確かにね』
「あともうひとつ。 GetData() のところ」

    int GetData() const

「 const って付いてるでしょ」
『あ、ホントだ。何度か見た事あるけど……変数に付いてる const と同
じ?』
「意味はね。メンバ関数のところに const が付いていると、そのメンバ関
数ではメンバ変数を書き換えることができなくなります。たとえば」

    int GetData() const
    {
        m_iData = 100;
        return m_iData;
    }

「ってすると」
『あ、コンパイルエラー』

error C2166: 左辺値は const オブジェクトに指定されています。

『左辺値?』
「まぁ、はっきりいって const メンバ関数はかなり難しい話になっちゃう
から、とりあえずは難しい事を考えないで〈値を返すメンバ関数には const 
を付ける〉くらいでいいから」
『 GetData() はただ値を返すだけだから、付ける、と』
「そういうこと。で、今の CHasMemberFunction クラスが、クラスの一番基
本的なものだから、これくらいはすらっと書けるようになって欲しいかな」
『む、努力します……』

/*
    Preview Next Story!
*/
『今までクラスなんて作ってなかったからむずかしー』
「ま、今はクラスを読むために作る、って感じかな」
『自分で作ってみれば解るようになるってこと?』
「そういうこと。どうしてそういう構造になってるかとか」
『理由がわかるから理解できる理由ね』
「この前使ったコンストラクタとデストラクタも」
『自分で作れば理解が深まる、と』
「というわけで次回」
< Version 11.17 コンストラクタとデストラクタを作る! >
『につづく!』
「ただあるものを使うよりよっぽど面白いと思うよ?」
『面白い、ねぇ……』
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。