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 koncepcje dotyczące właściwości klas: składowe prywatne z getterami i setterami, funkcje składowe const, składowe mutable, 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 odpowiednią enkapsulacją. Twoja klasa powinna zawierać:- Prywatne składowe:
accountNumber(string),ownerName(string),balance(double) orazmutable int queryCountdo śledzenia, ile razy sprawdzono saldo - Prywatną składową statyczną
totalAccountsdo śledzenia liczby istniejących kont - Konstruktor przyjmujący numer konta, imię i nazwisko właściciela oraz saldo początkowe. Powinien inicjalizować
queryCountwartością0i zwiększaćtotalAccounts - Gettery const:
getAccountNumber(),getOwnerName()igetBalance(): getter salda powinien zwiększaćqueryCountza każdym wywołaniem - Getter const
getQueryCount(), który zwraca liczbę sprawdzeń salda - 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 bieżącego 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 pieniądze między kontami. Powinna wykonać przelew 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: Pokaż działanie wszystkich tych funkcji razem. Wczytaj imiona i nazwiska dwóch właścicieli oraz dwa salda początkowe z wejścia (łącznie cztery wiersze: name1, balance1, name2, balance2), a następnie:- Utwórz dwa obiekty
BankAccounto numerach 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 za pomocą 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 wartości salda z ciągów znaków na liczby 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 są potrzebne.
Spróbuj swoich sił
#include <iostream>
#include <string>
#include <iomanip>
#include "BankAccount.h"
int main() {
// Odczytaj 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 format 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