続いて、「預け入れ」を行うメンバ関数を作りましょう。
預け入れは、金額を引数として渡し、残高を増やす事で実現します。
<sample program cpp051-01>
#include <iostream> class ATM { public: ATM(); void Deposit(const int amount); void ShowBallance() const; private: int m_balance; }; int main() { ATM ufj; ufj.Deposit(5000); ufj.ShowBallance(); return 0; } ATM::ATM() : m_balance(0) { } void ATM::Deposit(const int amount) { m_balance += amount; } void ATM::ShowBallance() const { std::cout << "残高は" << m_balance << "円です。" << std::endl; } |
<実行結果>
残高は5000円です。 続行するには何かキーを押してください・・・
預け入れ(Deposit)関数を追加しました。
実行すると残高が5000円になっている事が分かります。
単純に考えるとこれでよさそうな気がしますが、もう少し考えてみましょう。
全ての状況に対応する事は考えていませんが、問題点を書きます。
引数にマイナスの値が設定出来る。 預け入れの上限が設定されていない。
引数をマイナスにすると、残高が減ります。
預け入れのための関数なので、残高が減る事は無いはずです。
では、引数を「符号無し」に変更すれば良いでしょうか?
引数を「符号無し」にしたとしても、呼び出し元でマイナスの値が指定出来ますからあまり意味がありません。
また、実際のATMには1回あたりの預け入れ上限があるはずです。
機械的に札が入るか入らないか構造的な問題もあります。
これらの対応をDeposit関数に追加します。
<sample program cpp051-02>
#include <iostream> class ATM { public: ATM(); void Deposit(const int amount); void ShowBallance() const; private: int m_balance; }; int main() { ATM ufj; ufj.Deposit(-5000); ufj.ShowBallance(); return 0; } ATM::ATM() : m_balance(0) { } void ATM::Deposit(const int amount) { if (amount > 0 && amount <= 1000000) { m_balance += amount; } else { std::cout << "お取り扱い出来ない金額です。" << std::endl; } } void ATM::ShowBallance() const { std::cout << "残高は" << m_balance << "円です。" << std::endl; } |
<実行結果>
お取り扱い出来ない金額です。 残高は0円です。 続行するには何かキーを押してください・・・
取り扱える金額を1円〜100万円までにし、範囲外だとメッセージが表示されます。
このように、メンバ関数経由でメンバ変数にアクセスする事によって、様々なチェックが行えることもメンバ関数を使う利点です。
最後に引き出し用の関数を追加します。
引数として金額を渡し、引き出した金額を戻すように作ってみます。
<sample program cpp051-03>
#include <iostream> class ATM { public: ATM(); void Deposit(const int amount); int Withdraw(const int amount); void ShowBallance() const; private: int m_balance; }; int main() { ATM ufj; ufj.Deposit(5000); int cash = ufj.Withdraw(2000); ufj.ShowBallance(); return 0; } ATM::ATM() : m_balance(0) { } void ATM::Deposit(const int amount) { if (amount > 0 && amount <= 1000000) { m_balance += amount; } else { std::cout << "お取り扱い出来ない金額です。" << std::endl; } } int ATM::Withdraw(const int amount) { m_balance -= amount; return amount; } void ATM::ShowBallance() const { std::cout << "残高は" << m_balance << "円です。" << std::endl; } |
<実行結果>
残高は3000円です。 続行するには何かキーを押してください・・・
残高から指定した金額を差し引き、金額をそのまま戻り値にしています。
main関数は、5000円を預け2000円を引き出したため、残高が3000円になるよう作りました。
さて、こちらの関数も問題があります。
引き出し金額に上限が無い 引き出し金額にマイナスの値を入れると残高が増える
どちらも致命的な問題です。
残高である変数balanceは「符号あり」で作ってあります。
定期預金が組んであれば、自動的にマイナスになることもありますからね。
今回は定期預金の有無は分かりませんので、マイナスになるような引き出しは出来ないよう対処します。
また、1回の引き出し金額は100万円を限度にします。
さらに、マイナスの値が渡された場合もメッセージを表示するなどの対応をしましょう。
<sample program cpp051-04>
#include <iostream> class ATM { public: ATM(); void Deposit(const int amount); int Withdraw(const int amount); void ShowBallance() const; private: int m_balance; }; int main() { ATM ufj; ufj.Deposit(5000); int cash = ufj.Withdraw(8000); ufj.ShowBallance(); return 0; } ATM::ATM() : m_balance(0) { } void ATM::Deposit(const int amount) { if (amount > 0 && amount <= 1000000) { m_balance += amount; } else { std::cout << "お取り扱い出来ない金額です。" << std::endl; } } int ATM::Withdraw(const int amount) { if(amount < 0 || amount > 1000000){ std::cout << "ご利用限度額を超えています。" << std::endl; return 0; } if (m_balance < amount) { std::cout << "残高不足です。" << std::endl; return 0; } m_balance -= amount; return amount; } void ATM::ShowBallance() const { std::cout << "残高は" << m_balance << "円です。" << std::endl; } |
<実行結果>
残高不足です。 残高は5000円です。 続行するには何かキーを押してください・・・
金額などを変えて色々試してみてください。
他にも皆さんが気になる点などあれば自由に追加・変更を行ってください。