君とCしましょう。(未完成の暫定版)

未完成なので参考にならないらしい。

クラスとデータ構造

データ構造を表現する

データ構造は、いくつかのデータが集まってた構造が一つの情報となるっているものです。
たとえば、生徒の成績住所録の個人データのように幾つかの情報のまとまりが一つの情報単位になっているような場合のことを言います。
差し詰め「御饅頭詰め合わせセットの箱にある仕切り板」とでも言いましょうか。
他の言語でのレコードというのに少し似てますね。
C言語ではstructと言うキーワードを使ってデータ構造を定義します。
C++言語ではstructの代わりにclassというキーワードを使います。
classを使うと、参照できる関数を限定させることができるので、不用意に変数が書き換えられることを抑止することができます。
共通データ結合のようにstruct大域的に宣言されたデータ構造を用いると結合強度が高くなってしまい、変更や再利用に不便を感じる事があります。
そこで、classでデータ構造を定義して、アクセスできる式や関数を制限することで、モジュール強度を高める事ができ変更や再利用がやりやすくなります。
スタック構造やリスト構造やレコード管理などのポインタの管理で、管理に関与しない関数からポインタを不用意に書き換えることを防ぐのに有効な方法ですの。

スタック構造

スタック構造とは、山積みになった本のように積み上げていって、上に積んである本から順番に取り出していくような、データ構造ですの。
一度に取り出したり置いたりできる本は1冊とい約束でね。
一番後に積んだ本は、すぐに取り出せるけど、最初の方に積んだ本はなかなか取り出せないということですのよ。

下はスタックを使った例です。入力された文字列の順番を逆にして出力をしますの。


#include <iostream.h>
#include <stdlib.h>
#define STACK_DEEP 256        // スタックの深さをC言語のマクロで指定

class char_stack {
    char stack[STACK_DEEP];   // スタックの領域
    int  sp;                  // スタックのポインタ
public:
    int  push_stack();    // スタックに押し込む
    int  pop_stack();     // スタックから取り出す
    void init_stack();    // スタックを初期化する
}

int main( int argc, char *argv[])
{
    char ci[128];  // 文字列入力用の受け皿
    char co[128];  // 結果の文字列の受け皿
    char_stack st; // スタック
    int p=0;       // 受け皿のオフセット

    st.init_stack(); // スタックの初期化
    while (128>p++ && *(ci+p)!='\n' && *(ci+p)!=EOF ) *(ci+p)=cin.get(); // 文字列の入力    
    *(ci+p)='\0';   // 文字列の終わりの番兵
    p=0;            // 先頭に戻す
    while ( *(ci+p)!='\0') st.push_stack( (++p+ci) );  // スタックに押し込む
    p=0;            // 先頭に戻す
    while ( 0 != st.pop_stack( (ci+p++) )) cout<< (ci+p); // スタックから取り出す。
    return EXIT_SUCCESS;                // 正常終了
}

/*
int char_stack::push_stack(char *ch)
 スタックにつむ関数ですの。
1オクテットの文字が引数なの。
スタックポインタを返すの。
*/
int char_stack::push_stack(char *ch)
{
    stack[sp++] = *ch;
    return sp;
}

// スタックポインタ を初期化する。戻り値は、なしよ。
void char_stack::init_stack(void)
{
    sp=0;
    return;
}

/*-------------------------------------
int char_stack::char push_stack(char *ch)
 スタックにつむ関数ですの。
1オクテットの文字が引数なの。
スタックポインタを返すの。
------------------------------------*/
int char_stack::char push_stack(char *ch)
{
    *ch = stack[sp--];
    return sp;
}

クラスのオブジェクトの初期化

クラスの名前と同じ名前の関数をコンストラクタといい、クラスのオブジェクトを初期化するのにつかいます。

コンストラクタも多重化定義が可能です。
引数のないコンストラクタでデフォルトの初期化を定義するほかに、コンストラクタの引数にオブジェクトの初期値を渡すように設計したコンストラクタも同時に用意できます。

class human
{
char name[32];
char sex;
int age;
class human *old;
class human *next;
public:
human(); // デフォルトのコンストラクタ
human(char const *name, const char sex, const int age, NULL);
~human(); // デストラクタ
show();
nextdata(class human next);
}

クラスのオブジェクトの破棄

クラスの名前の前にチルダをつけた名前をもつ関数をデストラクタといいます。
オブジェクトが自動変数や静的変数で割り当てられている場合はとくにすることがないので、記述しなくてもすむことがおおいです。
しかし、オブジェクトをnewで動的に構築したクラスのオブジェクトを、消滅させるための記述をしておきます。。


著作権 1996年,1997年,1998年,2000年 ©大槻昌弥
著作者に無断で掲載や転載及び複製物の配布や販売などの営利目的へ利用する事を固く禁ずる。


ご意見、ご要望、ご感想は問い合わせフォームまでお願いします。

[STX][ETX]