Podsumowanie – menedżer konta bankowego
Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 33 z 104.
Wyzwanie
ŁatwyStwórzmy kompletnego menedżera kont bankowych, który łączy wszystkie poznane w tym rozdziale zagadnienia dotyczące właściwości klas: składowe prywatne z getterami i setterami, stałe funkcje składowe, składowe modyfikowalne, zmienne i metody statyczne oraz funkcje zaprzyjaźnione.
Utworzysz dwa pliki, aby uporządkować kod:
BankAccount.h: Zdefiniuj klasęBankAccount, która zarządza danymi konta z zachowaniem właściwej enkapsulacji. Klasa powinna mieć:- Prywatne składowe:
accountNumber(string),ownerName(string),balance(double) orazmutable int queryCountdo śledzenia, ile razy sprawdzono saldo - Prywatną statyczną składową
totalAccountsdo śledzenia liczby istniejących kont - Konstruktor przyjmujący numer konta, imię i nazwisko właściciela oraz początkowe saldo. Powinien inicjalizować
queryCountwartością0i zwiększaćtotalAccounts - Stałe gettery:
getAccountNumber(),getOwnerName()igetBalance(): getter salda powinien zwiększaćqueryCountprzy każdym wywołaniu - Stały getter
getQueryCount(), który zwraca, ile razy sprawdzono saldo - Metodę
deposit(double amount), która dodaje kwotę do salda tylko wtedy, gdy jest ona dodatnia - Metodę
withdraw(double amount), która odejmuje kwotę od salda tylko wtedy, gdy jest ona dodatnia i nie przekracza aktualnego salda - Metodę statyczną
getTotalAccounts(), która zwraca łączną liczbę utworzonych kont - Zadeklaruj funkcję zaprzyjaźnioną
transfer(BankAccount& from, BankAccount& to, double amount), która przenosi środki między kontami. Przelew powinien zostać wykonany tylko wtedy, gdy kwota jest dodatnia, a na koncie źródłowym są wystarczające środki
Zdefiniuj składową statyczną i funkcję zaprzyjaźnioną po definicji klasy.
- Prywatne składowe:
main.cpp: Zademonstruj współdziałanie wszystkich tych funkcji. Wczytaj imiona i nazwiska dwóch właścicieli oraz początkowe salda dwóch kont (łącznie cztery wiersze: name1, balance1, name2, balance2), a następnie:- Utwórz dwa obiekty
BankAccountz numerami kont"ACC001"i"ACC002" - Wypisz
"Total accounts: <count>" - Wypisz
"<name>: $<balance>"dla pierwszego konta - Wypisz
"<name>: $<balance>"dla drugiego konta - Wpłać
500.0na pierwsze konto - Wypisz
"After deposit - <name>: $<balance>"dla pierwszego konta - Przelej
300.0z pierwszego konta na drugie, używając funkcji zaprzyjaźnionej - Wypisz
"After transfer:" - Wypisz
" <name>: $<balance>"dla pierwszego konta - Wypisz
" <name>: $<balance>"dla drugiego konta - Wypisz
"Query count for <name>: <count>"dla pierwszego konta
- Utwórz dwa obiekty
Formatuj wszystkie wartości salda z dokładnością do dwóch miejsc po przecinku, używając std::fixed i std::setprecision(2) z <iomanip>. Konwertuj wczytane salda z ciągów znaków na wartości typu double za pomocą std::stod().
Nie zapomnij o strażnikach nagłówka w pliku nagłówkowym oraz o dołączeniu <string> i <iostream> tam, gdzie to potrzebne.
Spróbuj swoich sił
#include <iostream>
#include <string>
#include <iomanip>
#include "BankAccount.h"
int main() {
// Wczytaj dane wejściowe
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);
// Ustaw formatowanie wyjścia na 2 miejsca po przecinku
std::cout << std::fixed << std::setprecision(2);
// TODO: Utwórz dwa obiekty BankAccount o numerach kont "ACC001" i "ACC002"
// TODO: Wypisz "Total accounts: <count>"
// TODO: Wypisz "<name>: $<balance>" dla pierwszego konta
// TODO: Wypisz "<name>: $<balance>" dla drugiego konta
// TODO: Wpłać 500.0 na pierwsze konto
// TODO: Wypisz "After deposit - <name>: $<balance>" dla pierwszego konta
// TODO: Przelej 300.0 z pierwszego konta na drugie, używając funkcji zaprzyjaźnionej
// TODO: Wypisz "After transfer:"
// TODO: Wypisz " <name>: $<balance>" dla pierwszego konta (zwróć uwagę na wcięcie o 2 spacje)
// TODO: Wypisz " <name>: $<balance>" dla drugiego konta (zwróć uwagę na wcięcie o 2 spacje)
// TODO: Wypisz "Query count for <name>: <count>" dla pierwszego konta
return 0;
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneBudowanie i kompilacja C++Pliki nagłówkowe i pliki źródłowePrzestrzenie nazw i zakresWprowadzenie do programowania obiektowego w C++Klasy a obiektyWskaźnik „this”Metody (funkcje składowe)Atrybuty (składowe danych)Podstawy konstruktorów i destruktorówPowtórzenie – prosty kalkulator4Właściwości klas
Elementy instancji a elementy statyczneGettery i setteryStałe funkcje składoweSłowo kluczowe mutableMetody i zmienne statyczneFunkcje i klasy zaprzyjaźnionePodsumowanie – menedżer konta bankowego7Dziedziczenie
Podstawy dziedziczeniaPoziomy dostępu w dziedziczeniuKolejność wywołań konstruktora i destruktoraNadpisywanie metodFunkcje wirtualne i VTableWielokrotne dziedziczenieDziedziczenie wirtualnePowtórzenie — hierarchia pracowników2Zarządzanie pamięcią
Pamięć stosu a stertyWskaźniki i referencjePamięć dynamiczna (new/delete)Inteligentne wskaźniki w C++RAII w C++Podsumowanie — menedżer tablicy dynamicznej5Hermetyzacja
Specyfikatory dostępu w C++Specyfikatory dostępu — szczegółowoUkrywanie informacjiStruktura a klasaKlasy zagnieżdżone i wewnętrznePodsumowanie — system ewidencji studentów8Polimorfizm
Polimorfizm czasu kompilacji i wykonaniaPrzeciążanie funkcjiFunkcje wirtualne — powtórkaCzysto wirtualne funkcjeKlasy abstrakcyjneProjektowanie interfejsów w C++Rzutowanie dynamiczne i RTTIPodsumowanie — kalkulator kształtów3Konstruktory i destruktory
Konstruktor domyślnyKonstruktor z parametramiKonstruktor kopiującyKonstruktor przenoszącyListy inicjalizacyjne konstruktoraKonstruktory delegująceDestruktor — szczegółowe omówienieZasada trzech / pięciu / zeraPodsumowanie — klasa String6Przeciążanie operatorów
Wprowadzenie do przeciążania operatorówPrzeciążanie operatorów arytmetycznychPrzeciążanie operatorów porównaniaOperatory strumieniowePrzeciążanie operatora przypisaniaPrzeciążanie operatorów [] i ()Operatory konwersji typówPodsumowanie — klasa Matrix9Szablony
Szablony funkcjiSzablony klasSpecjalizacja szablonówSzablony wariadycznePodstawy SFINAE i cech typówPodsumowanie — kontener generycznyPoćwicz samodzielnie: Kompilator C++ online