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