Zusammenfassung - Bankkonto-Manager
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy — Lektion 33 von 104.
Aufgabe
EinfachLassen Sie uns einen vollständigen Bankkontomanager erstellen, der alle Konzepte für Klasseneigenschaften zusammenführt, die Sie in diesem Kapitel gelernt haben: private Member mit Gettern und Settern, const-Memberfunktionen, mutable Member, statische Variablen und Methoden sowie Friend-Funktionen.
Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:
BankAccount.h: Definieren Sie eineBankAccount-Klasse, die Kontodaten mit ordnungsgemäßer Kapselung verwaltet. Ihre Klasse sollte Folgendes enthalten:- Private Member:
accountNumber(string),ownerName(string),balance(double) und einmutable int queryCount, um zu verfolgen, wie oft der Kontostand abgefragt wurde - Ein privates statisches Member
totalAccounts, um zu verfolgen, wie viele Konten existieren - Einen Konstruktor, der die Kontonummer, den Namen des Eigentümers und das Anfangsguthaben entgegennimmt. Er sollte
queryCountmit0initialisieren undtotalAccountsinkrementieren - Const-Getter:
getAccountNumber(),getOwnerName()undgetBalance()— der Getter für das Guthaben solltequeryCountbei jedem Aufruf inkrementieren - Ein const-Getter
getQueryCount(), der zurückgibt, wie oft das Guthaben abgefragt wurde - Eine
deposit(double amount)-Methode, die den Betrag nur dann zum Guthaben addiert, wenn der Betrag positiv ist - Eine
withdraw(double amount)-Methode, die den Betrag nur dann vom Guthaben abzieht, wenn der Betrag positiv ist und das aktuelle Guthaben nicht übersteigt - Eine statische Methode
getTotalAccounts(), die die Gesamtzahl der erstellten Konten zurückgibt - Deklarieren Sie eine Friend-Funktion
transfer(BankAccount& from, BankAccount& to, double amount), die Geld zwischen Konten transferiert — sie sollte nur transferieren, wenn der Betrag positiv ist und die Quelle über ausreichende Mittel verfügt
Definieren Sie das statische Member und die Friend-Funktion nach der Klassendefinition.
- Private Member:
main.cpp: Demonstrieren Sie das Zusammenwirken all dieser Funktionen. Lesen Sie zwei Namen von Eigentümern und zwei Anfangsguthaben von der Eingabe ein (insgesamt vier Zeilen: name1, balance1, name2, balance2), dann:- Erstellen Sie zwei
BankAccount-Objekte mit den Kontonummern"ACC001"und"ACC002" - Geben Sie
"Total accounts: <count>"aus - Geben Sie
"<name>: "<name>: $<balance>"lt;balance>"für das erste Konto aus - Geben Sie
"<name>: "<name>: $<balance>"lt;balance>"für das zweite Konto aus - Zahlen Sie
500.0auf das erste Konto ein - Geben Sie
"After deposit - <name>: "After deposit - <name>: $<balance>"lt;balance>"für das erste Konto aus - Transferieren Sie
300.0vom ersten Konto auf das zweite unter Verwendung der Friend-Funktion - Geben Sie
"After transfer:"aus - Geben Sie
" <name>: " <name>: $<balance>"lt;balance>"für das erste Konto aus - Geben Sie
" <name>: " <name>: $<balance>"lt;balance>"für das zweite Konto aus - Geben Sie
"Query count for <name>: <count>"für das erste Konto aus
- Erstellen Sie zwei
Formatieren Sie alle Guthabenwerte mit zwei Dezimalstellen unter Verwendung von std::fixed und std::setprecision(2) aus <iomanip>. Konvertieren Sie die Guthabeneingaben mit std::stod() von Strings in Doubles.
Vergessen Sie nicht die Header-Guards in Ihrer Header-Datei und binden Sie <string> sowie <iostream> dort ein, wo sie benötigt werden.
Probier es selbst
#include <iostream>
#include <string>
#include <iomanip>
#include "BankAccount.h"
int main() {
// Eingabe lesen
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);
// Ausgabeformatierung auf 2 Dezimalstellen festlegen
std::cout << std::fixed << std::setprecision(2);
// TODO: Erstelle zwei BankAccount-Objekte mit den Kontonummern "ACC001" und "ACC002"
// TODO: Gib "Total accounts: <count>" aus
// TODO: Gib "<name>: $<balance>" für das erste Konto aus
// TODO: Gib "<name>: $<balance>" für das zweite Konto aus
// TODO: Zahle 500.0 auf das erste Konto ein
// TODO: Gib "After deposit - <name>: $<balance>" für das erste Konto aus
// TODO: Überweise 300.0 vom ersten auf das zweite Konto unter Verwendung der friend-Funktion
// TODO: Gib "After transfer:" aus
// TODO: Gib " <name>: $<balance>" für das erste Konto aus (beachte die Einrückung um 2 Leerzeichen)
// TODO: Gib " <name>: $<balance>" für das zweite Konto aus (beachte die Einrückung um 2 Leerzeichen)
// 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 & QuelldateienNamensräume & GültigkeitsbereicheEinführung in OOP in C++Klassen vs. ObjekteDer 'this'-PointerMethoden (Elementfunktionen)Attribute (Datenelemente)Grundlagen zu Ctors & DtorsRückblick - Einfacher Taschenrechner4Klasseneigenschaften
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen & KlassenZusammenfassung - Bankkonto-Manager7Vererbung
Grundlagen der VererbungZugriffsstufen bei VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick - Mitarbeiter-Hierarchie2Speicherverwaltung
Stack vs. Heap SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Smart Pointers in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsspezifizierer in C++Zugriffsspezifizierer im DetailInformation HidingStruct vs. ClassVerschachtelte & innere KlassenRückblick - Studentenverwaltungssystem8Polymorphie
Kompilierzeit- vs. Laufzeit-PolymorphieFunktionsüberladungVirtuelle Funktionen – WiederholungRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIZusammenfassung – Formen-Rechner3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorVerschiebekonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktoren im DetailRule of Three / Five / ZeroZusammenfassung - String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladen der [] und () OperatorenTypumwandlungsoperatorenRückblick - Matrix-Klasse9Templates
FunktionstemplatesKlassentemplatesTemplate-SpezialisierungVariadische TemplatesSFINAE & Type Traits GrundlagenRückblick - Generische Container