////////////////////////////////////////////////////////////////////
┏　 ───　▼　キャンペーンへのご参加はこちら！　▼　─── 　┓

           　   http://af1.mag2.com/m/af/0000008658/001/s00000001423001/034

┗ あなたにベストマッチの転職情報をゲットしよう！キャンペーン！ ┛
////////////////////////////////////////////////////////////////////
/*

    KAB-studio.h


    (C)KAB-studio 1999 - 2006 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz

    送信日： 2006/09/11(Mon) No.373
    配信数： 1713
    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
*/
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
// NEW!!
http://www.kab-studio.biz/index.html

2006/09/11 (Mon)
　ほとはー外伝３にP.70を追加！
[ 三人合体ホットハーブ 外伝３ 【ワタシ の キロク】 ]
http://www.kab-studio.biz/Comic/HotHerbA3/index.html

2006/09/11 (Mon)
　#pragma twice ホームページ版にアーカイブ追加！
16.22 演算子のオーバーロードの実例、の続き
16.23 引数のデフォルト値
[ #pragma twice ]
http://www.kab-studio.biz/Programing/PragmaTwice/index.html


////////////////////////////////////////////////////////////////////
// ちょお普通な日記
http://www.kab-studio.biz/nikki2/index.html

2006/09/03 (Sun)
　体が痛い。午前中は定期更新。夜に掛けてビデオのダビング、買った本の
まとめ、ビジネスキャリーのレビューとか。明日からはダイエット中心に
あまかいバグ取りとかを。おしごとの予定がないのでまずはPHPの連載
システム構築から。ねこみみかが面白かった。

2006/09/04 (Mon)
　朝６時に寝た。午後からあまかい修正。メタセコイアすごく使いやすい。
夜にプール。今月はダイエット第一。そしてSJC-P。

2006/09/05 (Tue)
　午前中と夕方はメタセコイア。午後はMachicianのサイト作り。荷物の件
の続き。

2006/09/06 (Wed)
　朝起きられない。メタセコイアで装甲多脚。風雅、舞い書き。プールが
お休み……。

2006/09/07 (Thu)
　疲れで作業効率悪し。メタセコイアで装甲多脚作り。あとはMachicianの
サイト作りとプール。ダイエットプラン。

2006/09/08 (Fri)
　起きるの本当に辛い。午前中はコミックス買いに行って、午後はMachician
公開。夜はほとはー外伝３のネーム切り。あとプール。

2006/09/09 (Sat)
　消防設備の点検のため８時半起き。あとはぐだー。一応ほとはー外伝３描
き。プール行ったら体が重かった。


////////////////////////////////////////////////////////////////////
// かぶろぐ。
http://d.hatena.ne.jp/kab_studio/

2006/09/03 (Sun)
http://d.hatena.ne.jp/kab_studio/20060903
起きた
[KAB-studio]ぷらとわ追加。
[KAB-studio][ほとはー]ほとはー外伝３はお休みします
[アニメ]「牙」 第23話「絆」
[アニメ]おねがいマイメロディ〜くるくるシャッフル！〜 
　第23話「タクトがとれたらイイのダー！」
[アニメ]ひぐらしのなく頃に 第22話「罪滅し編　其の壱　幸せ」
[装備]ACE GENE アーマ 62132 4輪トローリー ファーストインプレッション

2006/09/04 (Mon)
http://d.hatena.ne.jp/kab_studio/20060904
起きたよー。
[KAB-studio] [あまかい]トップ10バグ修正及び
　「スポーツ」「ヘルス&ビューティー」に対応
[装備]ニンテンドーDS Liteが壊れつつある。
[絵]メタセコイア始めました。
荷物が盗まれたかも、の続き・ペリカン便から連絡
[水泳ダイエット]9月1回目
[アニメ]ゼロの使い魔 第10話「姫君の依頼」
[アニメ]ARIA The NATURAL 第23話「その　海と恋と想いと…」

2006/09/05 (Tue)
http://d.hatena.ne.jp/kab_studio/20060905
起き。
荷物が盗まれたかも、の続き・そしてAmazonへ。
しまった！
[絵][ほとはー]リングガンはじめました
[買][アニメ]デ・ジ・キャラットDVD購入
[アニメ]N・H・Kにようこそ！ 第9話「夏の日にようこそ！」
たちばな書店が家の近くにできてた。

2006/09/06 (Wed)
http://d.hatena.ne.jp/kab_studio/20060906
起きた。
[絵][Machician設定]メタセコイアで装甲多脚
プールお休み！
[アニメ]桜蘭高校ホスト部 第23話「環の無自覚な憂鬱」

2006/09/07 (Thu)
http://d.hatena.ne.jp/kab_studio/20060907
起きた
[絵][Machician設定]メタセコイアで装甲多脚(2)
[アニメ]ゼーガペイン 第23話「沈まない月」
[水泳ダイエット]9月2回目

2006/09/08 (Fri)
http://d.hatena.ne.jp/kab_studio/20060908
起き。
なんだか今日はのんびり気分。
[link][装備]エプソンの新しい液晶プロジェクター
[link]日曜はじまりvs月曜はじまり
[買]本屋で買ってきたコミックス
[KAB-studio][Machician]Machician再始動
[水泳ダイエット]9月3回目
[link]アイデア却下。
[アニメ]無敵看板娘 第19話「働いて勝ち取れ」
[アニメ]無敵看板娘 第20話「激突！　西山勘九郎VS神無月めぐみ」

2006/09/09 (Sat)
http://d.hatena.ne.jp/kab_studio/20060909
起きた。
[水泳ダイエット]9月4回目
[アニメ]風人物語 第13話「雪緒ふたたび」(終)
[アニメ]彩雲国物語 第19話「かわいい娘には旅をさせよ」
[アニメ]おとぎ銃士 赤ずきん 第11話「草太と恋する魔法使い」
[アニメ]ふしぎ星の☆ふたご姫 Gyu! 第24話「跳べファイン！☆汗と涙のプリバウアー」
[アニメ]ウィッチブレイド 第22話「告」
[きらら]まんがタイムきらら 2006年10月号
[link]モンティホール・ジレンマ


////////////////////////////////////////////////////////////////////
// Ajaxでエロゲーを作るブログ
http://d.hatena.ne.jp/AjaxEroge/

（今週はお休みです）


////////////////////////////////////////////////////////////////////
// 風雅、舞い
http://www.kab-studio.biz/Novel/Fuga/index.html

■　第十五章　濁る澱み、清らかな血溜り　−１−

「あれ、舞さん出かけてるんですか？」
　更衣室で体を拭く俊雄が、すぐ外にいるリシュネに訊く。
「ええ、今ここにはいないわ。で、どうなの？」
「どうなのって……ずかずかと乗り込んできていきなりその質問はないん
じゃないかなぁ」
　フィオは空のカプセルに向かったまま、背中に立つリシュネに答える。手
はコンソールを叩き続け、たった３行のインジケーターを英文が流れていく。
「ＡＰになるにはまだ時間が掛かるわよ。今は下準備の段階、体全体に触媒
を流して魔法を植え付けやすくしているから」
「面倒な方法ね」
「あんた達と違って俊雄には適性がないし、私に言わせれば成長促進は危険
極まりない方法だわ」
「でもそうも言ってられないの」
　ＡＰと泉を継ぐ者、あわせても戦力がリシュネひとりしかいない現状。
「舞と彼がいない、雅樹もいない、はっきり言って今攻められたらひとたま
りもない」
「立ってる者は親でも使えってことわざがあるらしいけど、戦闘訓練を受け
ていなくてもＡＰならいいっていう考えはどうなの？」
「きれい事はいいの、現実を見て」
「今攻められたらここは落ちる、なら放棄することを優先すべじゃないの？
　是が非でもここを守るなんて、現実を見てないのはあんたの方よ」
　べき、と何かが壊れる音がする。フィオはそれでも振り向かない、振り向
きたくない。
「まぁまぁ、ケンカはやめましょうよ」
　一番空気にそぐわない発言をしつつ俊雄がカーテンを開ける。
「……まだみたいね。あんたに能力があったら、真っ先に舞を追い掛けるだ
ろうし」
「そんなことありませんよ。今だって、僕は舞さんを追い掛けているんです
から」
「そんなとんちみたいな話聞きに来たんじゃない。……こんなとこにいるよ
り、雅樹を捜した方がいいかもね」
「あ、舞さんはどこに？」
　部屋を出ようとするリシュネは、俊雄に一瞥して答える。
「……彼の故郷、よ」
                                                              (続く)

////////////////////////////////////////////////////////////////////
// JavaA2Z
http://www.kab-studio.biz/Programing/JavaA2Z/index.html

■追加・更新単語

（今週の追加はありません）


////////////////////////////////////////////////////////////////////
┏　 ───　▼　キャンペーンへのご参加はこちら！　▼　─── 　┓

           　   http://af1.mag2.com/m/af/0000008658/001/s00000001423001/034

┗ あなたにベストマッチの転職情報をゲットしよう！キャンペーン！ ┛
////////////////////////////////////////////////////////////////////
// #pragma twice
http://www.kab-studio.biz/Programing/PragmaTwice/index.html

　Version 17.18
「インターフェイス」という考え方

「前回はソートに抽象クラスと純粋仮想関数を使用してみました」
『ソートの比較をする所で使ってたんだよね』
「そう。使う側からの視点で整理すると、まず int 型の配列があって、そ
れをソートする関数がすでに用意されています」

// ソートを行う関数です。
void DoBubbleSortUseComapre
    ( int *p_piAry, int p_iSize, CComparetor *p_pcComparetor )
{
// （略）
}

「この関数に配列を渡すことでソートされますが、その際、昇順か降順かを
第3引数で決めることができます」
『 CIntComparetor クラスなら昇順で、 CIntDescComparetor クラスなら
降順ね』
「というわけで、 CIntComparetor クラスの変数を渡して、昇順でソート
しているのが以下の箇所」

    // 比較用クラスの変数を用意します（昇順）。
    CIntComparetor cIntComparetor;

    // ソートします。
    DoBubbleSortUseComapre( iAry, 5, &cIntComparetor );

「こうすることで、第3引数に CIntComparetor クラスの変数のポインタが
渡されます。このポインタを通して、さっきの DoBubbleSortUseComapre() 
関数内で〈要素の比較〉を行う時に CompareTo() メンバ関数を呼び出しま
す」
『このメンバ関数を呼び出すところで仮想関数の仕組みが使われてるわけね』
「そういうこと。ここで〈左が大きい時に true を返す〉ってしてるから
昇順でソートされるわけです」
『うん、ひとつひとつ追っていくと分かるんだけど……』
「じゃあ、今度は〈作る側〉の視点で見てみようか」
『作る側？』
「そう、これからソートをする関数を作るとします」
『うん』
「普通に作る場合、 Version 13.09 ( No.245 ) の DoBubbleSort() 関数の
ように作ることになります」

void DoBubbleSort( int *p_piAry, int p_iSize )
{
    // 「入れ替え先」のループです。
    for( int iOut = 0; iOut < p_iSize - 1; iOut++ )
    {
        // 最後から先頭方向へのループです。
        // ただし「入れ替え先」までです。
        for( int iIn = p_iSize - 1; iOut < iIn; iIn-- )
        {
            if( p_piAry[iIn - 1] > p_piAry[iIn] ) // ←ここ。
            {
                // 前の方が大きいので入れ替えます。
                int iTemp = p_piAry[iIn];
                p_piAry[iIn] = p_piAry[iIn - 1];
                p_piAry[iIn - 1] = iTemp;
            }
        }
    }
}

「だけど、この中で〈比較を行う箇所〉、つまりこの DoBubbleSort() 
関数の〈ここ〉は、できれば汎用化したいと考えます」
『なんで？』
「 Version 13.10 ( No.246 ) とかで言ってきたけど、データの種類、つま
配列の要素の型や、ソートの方法、つまり昇順や降順、構造体のどのメンバ
で比較するかによって、この比較処理を変える必要があるから」
『そういえば、それ以外のとこって変えなくていいんだよね』
「そう、ソートのアルゴリズムそのものはデータの種類に関係ないからね」
『で、ここを関数ポインタにしていたのが、 Cランタイムライブラリの 
qsort() 関数なんだよね』
「 Version 13.17 ( No.253 ) で説明したね。 qsort() 関数は
クイックソートをする関数だけど、この関数でどんな要素の配列でもソート
できるようにするためには」
『比較するところを渡す要素ごとに変えなきゃいけない！』
「なので、関数を作って、その関数ポインタを渡すことで、 qsort() 関数
の中から呼び出してもらうようにするわけです」
『……あ！』
「なに？」
『これにポリモーフィズムが使える、っていう話なんだ！』
「そういうこと。この関数ポインタの代わりに、ポリモーフィズムを使って
実現できるわけです。 DoBubbleSort() 関数の〈ここ〉をポリモーフィズム
で処理するために、まず Version 13.09 ( No.245 ) と同じく関数にします」

void DoBubbleSortUseComapre( int *p_piAry, int p_iSize )
{
    // 「入れ替え先」のループです。
    for( int iOut = 0; iOut < p_iSize - 1; iOut++ )
    {
        // 最後から先頭方向へのループです。
        // ただし「入れ替え先」までです。
        for( int iIn = p_iSize - 1; iOut < iIn; iIn-- )
        {
            if( CompareTo( p_piAry[iIn - 1], p_piAry[iIn] ) // ←ここ
                == true )
            {
                // 前の方が大きいので入れ替えます。
                int iTemp = p_piAry[iIn];
                p_piAry[iIn] = p_piAry[iIn - 1];
                p_piAry[iIn - 1] = iTemp;
            }
        }
    }
}

「次に、これを適当なクラスのメンバ関数にします。ここではクラスを 
CComparetor クラスにしておきます」

// ソートを行う関数です。
void DoBubbleSortUseComapre
    ( int *p_piAry, int p_iSize, CComparetor *p_pcComparetor )
{
    // 「入れ替え先」のループです。
    for( int iOut = 0; iOut < p_iSize - 1; iOut++ )
    {
        // 最後から先頭方向へのループです。
        // ただし「入れ替え先」までです。
        for( int iIn = p_iSize - 1; iOut < iIn; iIn-- )
        {
            if( p_pcComparetor->CompareTo  // ←ここ
                    ( p_piAry[iIn - 1], p_piAry[iIn] ) == true )
            {
                // 前の方が大きいので入れ替えます。
                int iTemp = p_piAry[iIn];
                p_piAry[iIn] = p_piAry[iIn - 1];
                p_piAry[iIn - 1] = iTemp;
            }
        }
    }
}

「ただの関数を、 CComparetor クラスのメンバ関数にしているだけだから
ね。引数と戻り値は同じだから。ただ、このクラスの変数をポインタにする
のを忘れないようにね」
『ポインタにしないとポリモーフィズムにならないもんね』
「次に CComparetor クラスを作ります。 CompareTo() メンバ関数を持たせ
て、これを純粋仮想関数にします」

// 比較用クラスの基本クラス。
class CComparetor
{
public:
    // 比較用メンバ関数。純粋仮想関数です。
    virtual bool CompareTo( int p_iL, int p_iR ) = 0;
};

『純粋仮想関数にしなきゃだめ？　ただの仮想関数でもいいんじゃない？』
「ただの仮想関数にした場合、以下の問題が出てきます」

・オーバーライドしなくてもいい
　→オーバーライドし忘れることがある
　→メンバ関数名や引数等を間違えてオーバーライドできてないことがある
・デフォルトの処理が必要
　→ソート対象の「デフォルトの型」が決まってないから無理

「まず、純粋仮想関数にしておけば、オーバーライドできていないと
コンパイルエラーになります」
『え、そうなの？
「 Version 17.16 ( No.371 ) で説明したように、純粋仮想関数は〈中身の
ないメンバ関数〉で、変数が作れないから』
『そか、オーバーライドできてないと中身がないままだから、変数が作れな
いんだ』
「だから純粋仮想関数の方が安全、っていうのがあります。あと純粋仮想関数
しておかないと中身を作る必要があるから」
『比較処理を書かなきゃいけないけど、それが無理ってことね』
「だから、これは純粋仮想関数がいいかな」
『で、純粋仮想関数を作ったら、あとは CIntComparetor クラスとかを作っ
て CompareTo() メンバ関数をオーバーライドすればいいわけね』
「このようにすることで、関数ポインタの代わり、つまり〈引数でポインタ
を渡すことで、関数内で呼び出してもらう〉ことができるわけです」
『コールバックしてもらえるわけねー』
「これがポリモーフィズムの使用目的のひとつかな」
『つまり、関数ポインタみたいに、関数の中から呼び出してもらうことがで
きる、そのために使えばいいってわけね』
「で、この CComparetor クラスみたいなクラスを【インターフェイス】と
言います」
『いんたーふぇいす？』
「ユーザーインターフェイスとかと同じ〈接点〉って意味だけど、それより
も〈操作するためのコネクタ〉って考えると分かりやすいかな。たとえば
DoBubbleSortUseComapre() 関数をもう一度見てみようか」

// ソートを行う関数です。
void DoBubbleSortUseComapre
    ( int *p_piAry, int p_iSize, CComparetor *p_pcComparetor )

「この関数がすでに提供されている場合、使う側は、CComparetor クラスの
派生クラスを作り、 CompareTo() メンバ関数をオーバーライドして、第3引数
にポインタを渡せばいいわけです」
『うん、そうなるね』
「ということはつまり、 DoBubbleSortUseComapre() 関数の〈比較処理〉を
呼び出す箇所がここから外に出ていて、そこに CComparetor クラスの
派生クラスを〈接続〉することで使ってもらえる、ってこと」
『？』
「図にするとこうなるかな」

                  ┌DoBubbleSortUseComapre┐ 
                  │ ・比較処理の呼び出し │
                  └────↓──────┘
                            ↓
           （第3引数・ CComparetor クラスのポインタ）
                            ↓
                            ↓
                CompareTo() メンバ関数の呼び出し
                 ↑                            ↑
   こっちを渡すと↑              こっちを渡すと↑
   昇順ソート    ↑              降順ソート    ↑
     ┌─────┴─────┐  ┌──────┴──────┐
     │CIntComparetor クラス │  │CIntDescComparetor クラス │
     └───────────┘  └─────────────┘

「つまり、第3引数が〈比較処理の接続口〉になっていて、ここに
CIntComparetor クラスの変数をくっつけると昇順ソート、
CIntDescComparetor クラスの変数をくっつけると降順ソートになる、そう
いう機能を持っているから、 CComparetor クラスのようなクラスを
【インターフェイス】って言うんです」

/*
    Preview Next Story!
*/
『……うううっ、ちょっと分からないかもっ』
「うん、この辺がポリモーフィズムで一番難しいところかもね」
『次回もこの続きなんだねっ』
「うんもちろん。……それで良かった？」
『いいような悪いような……』
「というわけで次回」
＜ Version 17.19 インターフェイスの使い方 ＞
『につづく！』
「とりあえず、ちゃんと理解するまでは説明するから」
『うん、その方がいいかも』
「まぁ嫌って言っても説明するけど」
『オニー！』


////////////////////////////////////////////////////////////////////
/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.biz/nikki2/index.html
・購読登録を解除したいときにはこのページで行なってください。
http://www.mag2.com/m/0000012198.htm
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://backno.mag2.com/reader/Back?id=0000012198
http://www.kab-studio.biz/Freeware/index.html#MailMagazine


////////////////////////////////////////////////////////////////////
/*
    KAB-studio.h
      Weekly Mail Magazine.
      Written by Kaburaya Seiden.
      http://www.kab-studio.biz/Info/MailMagazine/

    (C)KAB-studio 1999 - 2006 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz
*/
////////////////////////////////////////////////////////////////////

