Zusammenfassung – Bankkontoverwaltung
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy. Lektion 33 von 104.
Aufgabe
EinfachLass uns einen vollständigen Bank Account Manager erstellen, der alle Konzepte zu Klasseneigenschaften zusammenführt, die du in diesem Kapitel gelernt hast: private Member mit Gettern und Settern, const-Memberfunktionen, mutable-Member, statische Variablen und Methoden sowie Friend-Funktionen.
Du erstellst zwei Dateien, um deinen Code zu organisieren:
BankAccount.h: Definiere eineBankAccount-Klasse, die Kontodaten mit geeigneter Kapselung verwaltet. Deine Klasse sollte Folgendes enthalten:- Private Member:
accountNumber(string),ownerName(string),balance(double) und einmutable int queryCount, um zu erfassen, wie oft der Kontostand abgefragt wurde - Ein privates statisches Member
totalAccounts, um zu erfassen, wie viele Konten existieren - Einen Konstruktor, der die Kontonummer, den Namen des Kontoinhabers und den anfänglichen Kontostand übernimmt. Er sollte
queryCountauf0initialisieren undtotalAccountserhöhen - Const-Getter:
getAccountNumber(),getOwnerName()undgetBalance(): Der Getter für den Kontostand solltequeryCountbei jedem Aufruf erhöhen - Einen const-Getter
getQueryCount(), der zurückgibt, wie oft der Kontostand abgefragt wurde - Eine
deposit(double amount)-Methode, die den Kontostand nur dann erhöht, wenn der Betrag positiv ist - Eine
withdraw(double amount)-Methode, die den Kontostand nur dann verringert, wenn der Betrag positiv ist und den aktuellen Kontostand nicht übersteigt - Eine statische Methode
getTotalAccounts(), die die Gesamtzahl der erstellten Konten zurückgibt - Eine Friend-Funktion
transfer(BankAccount& from, BankAccount& to, double amount)deklarieren, die Geld zwischen Konten überträgt. Sie sollte nur dann Geld übertragen, wenn der Betrag positiv ist und das Quellkonto über ausreichende Mittel verfügt
Definiere das statische Member und die Friend-Funktion nach der Klassendefinition.
- Private Member:
main.cpp: Zeige, wie all diese Funktionen zusammenarbeiten. Lies zwei Namen von Kontoinhabern und zwei anfängliche Kontostände aus der Eingabe ein (insgesamt vier Zeilen: name1, balance1, name2, balance2), dann:- Erstelle zwei
BankAccount-Objekte mit den Kontonummern"ACC001"und"ACC002" - Gib
"Total accounts: <count>"aus - Gib
"<name>: $<balance>"für das erste Konto aus - Gib
"<name>: $<balance>"für das zweite Konto aus - Zahle
500.0auf das erste Konto ein - Gib
"After deposit - <name>: $<balance>"für das erste Konto aus - Übertrage mithilfe der Friend-Funktion
300.0vom ersten Konto auf das zweite - Gib
"After transfer:"aus - Gib
" <name>: $<balance>"für das erste Konto aus - Gib
" <name>: $<balance>"für das zweite Konto aus - Gib
"Query count for <name>: <count>"für das erste Konto aus
- Erstelle zwei
Formatiere alle Kontostände mit zwei Dezimalstellen mithilfe von std::fixed und std::setprecision(2) aus <iomanip>. Wandle die Kontostand-Eingaben mit std::stod() von Strings in Doubles um.
Vergiss nicht die Header Guards in deiner Headerdatei und binde bei Bedarf <string> und <iostream> ein.
Probier es selbst
#include <iostream>
#include <string>
#include <iomanip>
#include "BankAccount.h"
int main() {
// Eingabe einlesen
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);
// Ausgabe auf 2 Dezimalstellen formatieren
std::cout << std::fixed << std::setprecision(2);
// TODO: Zwei BankAccount-Objekte mit den Kontonummern "ACC001" und "ACC002" erstellen
// TODO: "Total accounts: <count>" ausgeben
// TODO: "<name>: $<balance>" für das erste Konto ausgeben
// TODO: "<name>: $<balance>" für das zweite Konto ausgeben
// TODO: 500.0 auf das erste Konto einzahlen
// TODO: "After deposit - <name>: $<balance>" für das erste Konto ausgeben
// TODO: 300.0 mithilfe der Friend-Funktion vom ersten auf das zweite Konto übertragen
// TODO: "After transfer:" ausgeben
// TODO: " <name>: $<balance>" für das erste Konto ausgeben (die Einrückung um 2 Leerzeichen beachten)
// TODO: " <name>: $<balance>" für das zweite Konto ausgeben (die Einrückung um 2 Leerzeichen beachten)
// TODO: Gib "Query count for <name>: <count>" für das erste Konto aus
return 0;
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienC++ Build & KompilierungHeader-Dateien & QuelldateienNamespaces & GültigkeitsbereichEinführung in OOP mit C++Klassen vs. ObjekteDer „this“-ZeigerMethoden (Member-Funktionen)Attribute (Datenmember)Grundlagen zu Ctors & DtorsRückblick – Einfacher Taschenrechner4Klassenattribute
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen und -KlassenZusammenfassung – Bankkontoverwaltung7Vererbung
Grundlagen der VererbungZugriffsebenen bei der VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick – Mitarbeiterhierarchie2Speicherverwaltung
Stack- vs. Heap-SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Intelligente Zeiger in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsbezeichner in C++Zugriffsbezeichner im DetailInformationsverbergungStruct vs. KlasseVerschachtelte und innere KlassenWiederholung – Studierendenverwaltungssystem8Polymorphie
Polymorphie zur Compilezeit vs. LaufzeitFunktionsüberladungVirtuelle Funktionen erneut betrachtetRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIRückblick – Shape-Calculator3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorMove-KonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktor im DetailDrei-/Fünf-/Null-RegelZusammenfassung – String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladung der Operatoren [] und ()TypkonvertierungsoperatorenWiederholung – Matrix-Klasse9Templates
FunktionstemplatesKlassen-TemplatesTemplate-SpezialisierungVariadische TemplatesGrundlagen zu SFINAE und Type TraitsRückblick – Generischer ContainerÜbe selbstständig: Online-C++-Compiler