Riepilogo - Gestore di conti bancari
Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 33 di 104.
Sfida
FacileCostruiamo un gestore completo di conti bancari che riunisce tutti i concetti relativi alle proprietà delle classi che hai imparato in questo capitolo: membri privati con getter e setter, funzioni membro const, membri mutable, variabili e metodi statici e funzioni friend.
Creerai due file per organizzare il codice:
BankAccount.h: definisci una classeBankAccountche gestisce i dati dei conti con un corretto incapsulamento. La classe deve avere:- Membri privati:
accountNumber(stringa),ownerName(stringa),balance(double) e unmutable int queryCountper tenere traccia del numero di volte in cui è stato controllato il saldo - Un membro statico privato
totalAccountsper tenere traccia del numero di conti esistenti - Un costruttore che accetta il numero del conto, il nome del titolare e il saldo iniziale. Deve inizializzare
queryCounta0e incrementaretotalAccounts - Getter const:
getAccountNumber(),getOwnerName()egetBalance(): il getter del saldo deve incrementarequeryCountogni volta che viene chiamato - Un getter const
getQueryCount()che restituisce il numero di volte in cui è stato controllato il saldo - Un metodo
deposit(double amount)che aggiunge al saldo solo se l'importo è positivo - Un metodo
withdraw(double amount)che sottrae dal saldo solo se l'importo è positivo e non supera il saldo attuale - Un metodo statico
getTotalAccounts()che restituisce il numero totale di conti creati - Dichiara una funzione friend
transfer(BankAccount& from, BankAccount& to, double amount)che trasferisce denaro tra i conti. Deve effettuare il trasferimento solo se l'importo è positivo e il conto di origine dispone di fondi sufficienti
Definisci il membro statico e la funzione friend dopo la definizione della classe.
- Membri privati:
main.cpp: mostra tutte queste funzionalità in azione. Leggi da input due nomi di titolari e due saldi iniziali (quattro righe in totale: name1, balance1, name2, balance2), poi:- Crea due oggetti
BankAccountcon i numeri di conto"ACC001"e"ACC002" - Stampa
"Total accounts: <count>" - Stampa
"<name>: $<balance>"per il primo conto - Stampa
"<name>: $<balance>"per il secondo conto - Deposita
500.0sul primo conto - Stampa
"After deposit - <name>: $<balance>"per il primo conto - Trasferisci
300.0dal primo conto al secondo usando la funzione friend - Stampa
"After transfer:" - Stampa
" <name>: $<balance>"per il primo conto - Stampa
" <name>: $<balance>"per il secondo conto - Stampa
"Query count for <name>: <count>"per il primo conto
- Crea due oggetti
Formatta tutti i valori dei saldi con due cifre decimali usando std::fixed e std::setprecision(2) di <iomanip>. Converti gli input dei saldi da stringhe a double usando std::stod().
Non dimenticare le protezioni dell'header nel file header e di includere <string> e <iostream> dove necessario.
Provalo tu
#include <iostream>
#include <string>
#include <iomanip>
#include "BankAccount.h"
int main() {
// Leggi l'input
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);
// Imposta la formattazione dell'output a 2 cifre decimali
std::cout << std::fixed << std::setprecision(2);
// TODO: Crea due oggetti BankAccount con i numeri di conto "ACC001" e "ACC002"
// TODO: Stampa "Total accounts: <count>"
// TODO: Stampa "<name>: $<balance>" per il primo conto
// TODO: Stampa "<name>: $<balance>" per il secondo conto
// TODO: Deposita 500.0 sul primo conto
// TODO: Stampa "After deposit - <name>: $<balance>" per il primo conto
// TODO: Trasferisci 300.0 dal primo conto al secondo usando la funzione friend
// TODO: Stampa "After transfer:"
// TODO: Stampa " <name>: $<balance>" per il primo conto (nota il rientro di 2 spazi)
// TODO: Stampa " <name>: $<balance>" per il secondo conto (nota il rientro di 2 spazi)
// TODO: Stampa "Query count for <name>: <count>" per il primo conto
return 0;
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniBuild e compilazione in C++File header e file sorgenteNamespace e ambitoIntroduzione alla programmazione orientata agli oggetti in C++Classi e oggetti a confrontoIl puntatore 'this'Metodi (funzioni membro)Attributi (membri dati)Fondamenti di costruttori e distruttoriRiepilogo - Calcolatrice semplice4Proprietà delle classi
Membri di istanza e staticiGetter e setterFunzioni membro constParola chiave mutableMetodi e variabili staticiFunzioni e classi friendRiepilogo - Gestore di conti bancari7Ereditarietà
Ereditarietà di baseLivelli di accesso nell’ereditarietàOrdine di chiamata di costruttori e distruttoriRidefinizione dei metodiFunzioni virtuali e VTableEreditarietà multiplaEreditarietà virtualeRiepilogo - Gerarchia dei dipendenti2Gestione della memoria
Memoria Stack vs HeapPuntatori e riferimentiMemoria dinamica (new/delete)Puntatori intelligenti in C++RAII in C++Riepilogo - Gestore di array dinamico5Incapsulamento
Specificatori di accesso in C++Specificatori di accesso in dettaglioOccultamento delle informazioniStruct vs classClassi annidate e interneRiepilogo - Sistema di registrazione degli studenti8Polimorfismo
Polimorfismo a compile time e a runtimeOverload delle funzioniFunzioni virtuali: ripassoFunzioni virtuali pureClassi astratteProgettazione delle interfacce in C++Dynamic casting e RTTIRipasso: calcolatrice di forme11Concetti avanzati di OOP
Composizione vs ereditarietàMixin tramite CRTPIdiom PimplType ErasureEnum class e tipizzazione forteGestione delle eccezioni in OOPGerarchie personalizzate di eccezioni14Pattern di progettazione - Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositeRAII come pattern3Costruttori e distruttori
Costruttore predefinitoCostruttore con parametriCostruttore di copiaCostruttore di spostamentoListe di inizializzazione dei costruttoriCostruttori delegantiApprofondimento sui distruttoriRegola del Tre / Cinque / ZeroRipasso - classe String6Sovraccarico degli operatori
Introduzione al sovraccarico degli operatoriSovraccarico degli operatori aritmeticiSovraccarico degli operatori di confrontoOperatori di flussoSovraccarico dell'operatore di assegnazioneSovraccarico degli operatori [] e ()Operatori di conversione di tipoRipasso - Classe Matrix9Template
Template di funzioneTemplate di classeSpecializzazione dei templateTemplate variadiciBasi di SFINAE e dei trait di tipoRiepilogo - Contenitore genericoEsercitati da solo: Compilatore C++ online