復習 - 銀行口座マネージャー
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 33/104。
チャレンジ
簡単この章で学んだクラスのプロパティに関する概念、つまりゲッターとセッターを使った非公開メンバー、constメンバー関数、mutableメンバー、static変数とメソッド、フレンド関数をすべて組み合わせて、完全な銀行口座管理プログラムを作りましょう。
コードを整理するため、2つのファイルを作成します。
BankAccount.h: 適切なカプセル化を用いて口座データを管理するBankAccountクラスを定義します。クラスには次のものを含めます。- 非公開メンバー:
accountNumber(string)、ownerName(string)、balance(double)、および残高が確認された回数を記録するmutable int queryCount - 存在する口座数を記録する非公開のstaticメンバー
totalAccounts - 口座番号、所有者名、初期残高を受け取るコンストラクター。
queryCountを0に初期化し、totalAccountsをインクリメントします。 - constゲッター:
getAccountNumber()、getOwnerName()、getBalance()。残高ゲッターは、呼び出されるたびにqueryCountをインクリメントします。 - 残高が確認された回数を返すconstゲッター
getQueryCount() - 金額が正の場合に限り残高に加算する
deposit(double amount)メソッド - 金額が正で、現在の残高を超えない場合に限り残高から差し引く
withdraw(double amount)メソッド - 作成された口座の総数を返すstaticメソッド
getTotalAccounts() - 口座間でお金を移動するフレンド関数
transfer(BankAccount& from, BankAccount& to, double amount)を宣言します。金額が正で、送金元に十分な資金がある場合に限り、送金を行います。
クラス定義の後に、staticメンバーとフレンド関数を定義します。
- 非公開メンバー:
main.cpp: これらすべての機能が連携して動作することを示します。入力から所有者名2つと初期残高2つを読み取ります(合計4行: name1、balance1、name2、balance2)。次に、以下を行います。- 口座番号
"ACC001"と"ACC002"を持つBankAccountオブジェクトを2つ作成します。 "Total accounts: <count>"を出力します。- 1つ目の口座について
"<name>: $<balance>"を出力します。 - 2つ目の口座について
"<name>: $<balance>"を出力します。 - 1つ目の口座に
500.0を入金します。 - 1つ目の口座について
"After deposit - <name>: $<balance>"を出力します。 - フレンド関数を使って、1つ目の口座から2つ目の口座へ
300.0を送金します。 "After transfer:"を出力します。- 1つ目の口座について
" <name>: $<balance>"を出力します。 - 2つ目の口座について
" <name>: $<balance>"を出力します。 - 1つ目の口座について
"Query count for <name>: <count>"を出力します。
- 口座番号
<iomanip>のstd::fixedとstd::setprecision(2)を使い、すべての残高を小数点以下2桁で表示します。残高の入力値は、std::stod()を使って文字列からdoubleに変換します。
ヘッダーファイルにヘッダーガードを忘れずに記述し、必要に応じて<string>と<iostream>をインクルードしてください。
自分で試してみよう
#include <iostream>
#include <string>
#include <iomanip>
#include "BankAccount.h"
int main() {
// 入力を読み込む
std::string name1, name2;
std::string balance1Str, balance2Str;
std::getline(std::cin, name1);
std::getline(std::cin, balance1Str);
std::getline(std::cin, name2);
std::getline(std::cin, balance2Str);
double balance1 = std::stod(balance1Str);
double balance2 = std::stod(balance2Str);
// 出力形式を小数点以下2桁に設定する
std::cout << std::fixed << std::setprecision(2);
// TODO: 口座番号が "ACC001" と "ACC002" の2つのBankAccountオブジェクトを作成する
// TODO: "Total accounts: <count>" を出力する
// TODO: 最初の口座について "<name>: $<balance>" を出力する
// TODO: 2番目の口座について "<name>: $<balance>" を出力する
// TODO: 最初の口座に500.0を入金する
// TODO: 最初の口座について "After deposit - <name>: $<balance>" を出力する
// TODO: friend関数を使って、最初の口座から2番目の口座へ300.0を振り替える
// TODO: "After transfer:" を出力する
// TODO: 最初の口座について " <name>: $<balance>" を出力する(2スペースのインデントに注意)
// TODO: 2番目の口座について " <name>: $<balance>" を出力する(2スペースのインデントに注意)
// TODO: 最初の口座について "Query count for <name>: <count>" を出力する
return 0;
}
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタパラメータ付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ徹底解説Rule of Three / Five / Zero復習 - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () の演算子オーバーロード型変換演算子復習 - Matrixクラス自分で練習してみよう: C++オンラインコンパイラ