クラスの定義とnewによるオブジェクトの生成,メンバ関数 |
使用ソースコードをダウンロードして参考にして下さい。
●適切な値の変更
インスタンスが初期化された後,インスタンスの値を目的にそった手順(アルゴリズム)で,逐次変更していかなくてはなりません(Fig. 2.1-(3))。
残念ながら,アルゴリズムの正しさを保証する機能はC言語/C++をはじめ大部分のプログラミング言語ではサポートされていません。ですから,ここでは
アルゴリズムは正しいと仮定し,インスタンスの値が不正に変更されないかという危険性の方を考えてみましょう。Fig. 2.3に,インスタンスの値が不正な
操作により破壊される様子を示します。このような不正な操作が行われてしまうと,いくらアルゴリズムが正しくても,プログラムは正しく動作しません。
例として,C言語で書かれた単純なスタック(stack)の場合を考えてみましょう。スタックとは,プログラムでよく使われるデータ構造です。英単語のstackの
意味するところは,“積み重ねる”という意味です。収納箱の中に座布団を積み重ねるところを想像すると分かりやすいかもしれません(Fig. 2.4)。例えば,茶色
の座布団,白の座布団,赤の座布団の順で収納箱の中に座布団を積むと(Fig. 2.4-(1)),収納箱の一番下には最初に入れた茶色の座布団,その上に白の座布団
が乗り,一番上に赤い座布団が乗ることになります(Fig. 2.4-(2))。このとき,外部から見えるのは一番上に積まれている赤い座布団だけです。そして,この収納箱
から座布団を取り出すときは,一番上に積んである赤い座布団から取り出すことになります(Fig. 2.4-(3))。つまり,“最後に入れた物から取り出すこと”になる
というわけです。
このように“データを積み上げて,取り出すときはその一番上から取る”と,自然と“最後に入力したデータから出力する”という性質が生まれます。この性質を
“後入れ先出し(last-in-first-out, LIFO)”と呼びます。“後入れ先出し”という性質をもつデータ構造をスタックと呼ぶのです。スタックにデータを入力する(一番上に積む)
ことをプッシュ(push),スタックからデータを出力させる(一番上から取り出す)ことをポップ(pop)と言います。なお,スタックの一番上のデータがある位置を
スタックのトップ(top),一番下のデータがある位置を“底”という意味からボトム(bottom)と言います。ある時点で値を参照できるデータはトップの位置に
あるものだけ,ということに注意して下さい。
ここでは。配列を使ってスタックを実装してみましょう(Fig. 2.5)。配列に格納された要素の列の最後尾に要素を挿入する操作をプッシュ,最後尾の要素を
取り出して削除する操作をポップとすればいいわけです。最後尾の要素位置がスタックのトップ,最初の要素位置がスタックのボトムになります。
実際に配列を使ってスタックの実装したC言語プログラムの例をList 2.5に示します。
この例ではchar型のデータを最大STACK_SIZE個だけ格納可能なスタック型Stackを定義しています。メンバspはその時点で格納されている
要素の個数を表し,
buff[ spの値 - 1 ]
がスタックトップに位置する要素となります。さて,List 2.5を実行すると,本来は
keep
と表示されるはずですが,
kep
error!!
と表示され,期待した実行結果は得られません。これは39行目でスタックのメンバspの値が不正に操作されているためです。
このような不正な操作を防ぐには,
・関連するデータ( 変数)をまとめて,それらのデータに対して行える処理(関数)を必要な物だけに限定する。
必要があります。それが次に説明するクラスです。