第29章 家計簿を作ろう その3


今回は、前章で作った家計簿に 収入、支出でそれぞれ簡単な項目を付けましょう。

そのくらいなら、前回作ったクラスを少し変更するだけで できそうです。でも、今回は練習のため前回まで作った クラスには、一切変更を加えません

エー!そんなことできるの?

はい。できます。クラスを継承して新しいクラスを作ればよいですね。 前回作ったクラスは必ずしもよいクラスではありません。 でも、元のクラスには一切手を加えずクラスを追加してみましょう。 まず、項目を追加するのでクラス名は、「項目」クラスとでもしておきましょう。

//kclass.h class Kakeibo { protected: int zankin; public: Kakeibo(); void Input(int); void Output(int); void Disp(void); int GetZankin(void); void SetZankin(void); }; class Komoku : public Kakeibo { int Shokuhi; int Kosaihi; int Others; int OutgoTotal; int Kyuyo; int Zatsushu; int IncomeTotal; int Item; public: Komoku(void); void SetSection(void); void SetKingaku(int); void Disp(void); };

今回は、少しプログラムが長くなるので クラスの定義は、kclass.hというファイルにまとめました。 本家本元のソースファイルに#include "kclass.h"という のを忘れずに入れて下さい。

Kakeiboクラスは、前回と同じです。 このKakeiboクラスからKomokuクラスを導出(派生)します。 クラスの継承についてわからない(忘れた)人は、 第10章を参照して下さい。 クラスの継承の時のアクセスコントロールについて よくわからないときはpublicとしておいて下さい。 昔のコンパイラではクラスの継承のアクセスコントロールを 記述しなくてもよいものもあるようですが、 きちんと書くのが正しい書き方でしょう(多分)。


では、Komokuクラスのメンバをみてみましょう。 食費、交際費、その他(の支出)、支出合計、 給与、雑収、収入合計、は名前から類推できますね。 Itemはどの項目を選んだかを入れておく変数です。

次に、メンバ関数をみてみましょう。 コンストラクタは、多分データメンバを初期化するとき に使うでしょう。SetSection関数は、収入か支出かまた その項目はどれかをセットする関数にします。 SetKingaku関数は選んだ項目の金額をセットする関数です。 Disp関数は、その名の通り各項目の表示です。 ここで、Disp関数はKakeibo関数にも同名の関数があることに 注意して下さい。

さて、クラスのだいたいの構造ができたらmain関数は どんな感じになるでしょうか。 まず、項目クラスのオブジェクトMyKomokuを生成します。 次に、SetSectionメンバ関数を呼んで、項目を設定します。 項目が決まったら金額を入力します。そして、 SetKingaku関数で金額をセットします。 これをグルグル回しにすればよいですね。 サービスで金額をセットしたら自動的に各項目を 表示させてもよいですね。 最後に残金をKakeiboクラスのメンバ関数を使って ファイルに記録します。

あれ?前回までの残金を何時ファイルから読み込んでいるの?

これは、よい質問ですね。Kakeiboクラスのコンストラクタは ファイルから前回までの残金を読み出していました。 Kakeiboクラスから派生したKomokuクラスでは、 元のクラスのコンストラクタも自動的に呼ばれます。 従ってわざわざファイルを読み込む関数を作らなくてもよいのです。 これが、クラスを使うときの利点の一つです。 では、main関数を作ってみましょう。まだ、クラスの メンバ関数の中身は作っていません。この中身は、 fclass.hというファイルに書くことにします。 とりあえず、本家本元のソースファイルには このファイルもインクルードしておいて下さい。

#include <iostream.h> #include <fstream.h> #include <stdlib.h> #include "kclass.h" #include "fclass.h" int main(void) { char sw; int okane; cout << "家計簿" << endl; Komoku MyKomoku; while(1) { MyKomoku.SetSection(); cout << "金額="; cin >> okane; MyKomoku.SetKingaku(okane); MyKomoku.Disp(); cout << "続けますか(Y/N)"; cin >> sw; if (sw == 'N') break; } MyKomoku.SetZankin(); return 0; }


どうです。main関数だけみると、簡単そうに見えますね。 簡単そうに見えるということが大事です。 次回は、メンバ関数の中身を考えてみましょう。 本当にうまく動くか心配ですね・・・ (^-^;) 。


[C++Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Feb/24/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。