Resumen - Gestor de cuentas bancarias
Parte de la sección Programación Orientada a Objetos del Journey de C++ de Coddy — lección 33 de 104.
Desafío
FácilVamos a construir un Gestor de Cuentas Bancarias completo que reúna todos los conceptos de propiedades de clase que has aprendido en este capítulo: miembros privados con getters y setters, funciones miembro const, miembros mutable, variables y métodos estáticos, y funciones friend.
Crearás dos archivos para organizar tu código:
BankAccount.h: Define una claseBankAccountque gestione los datos de la cuenta con una encapsulación adecuada. Tu clase debe tener:- Miembros privados:
accountNumber(string),ownerName(string),balance(double), y unmutable int queryCountpara rastrear cuántas veces se ha consultado el saldo - Un miembro estático privado
totalAccountspara rastrear cuántas cuentas existen - Un constructor que reciba el número de cuenta, el nombre del propietario y el saldo inicial. Debe inicializar
queryCounta0e incrementartotalAccounts - Getters const:
getAccountNumber(),getOwnerName(), ygetBalance()— el getter del saldo debe incrementarqueryCountcada vez que se llame - Un getter const
getQueryCount()que devuelva cuántas veces se consultó el saldo - Un método
deposit(double amount)que sume al saldo solo si la cantidad es positiva - Un método
withdraw(double amount)que reste del saldo solo si la cantidad es positiva y no excede el saldo actual - Un método estático
getTotalAccounts()que devuelva el número total de cuentas creadas - Declarar una función amiga (friend)
transfer(BankAccount& from, BankAccount& to, double amount)que mueva dinero entre cuentas — solo debe transferir si la cantidad es positiva y el origen tiene fondos suficientes
Define el miembro estático y la función friend después de la definición de la clase.
- Miembros privados:
main.cpp: Demuestra todas estas características funcionando juntas. Lee dos nombres de propietarios y dos saldos iniciales de la entrada (cuatro líneas en total: name1, balance1, name2, balance2), luego:- Crea dos objetos
BankAccountcon los números de cuenta"ACC001"y"ACC002" - Imprime
"Total accounts: <count>" - Imprime
"<name>: "<name>: $<balance>"lt;balance>"para la primera cuenta - Imprime
"<name>: "<name>: $<balance>"lt;balance>"para la segunda cuenta - Deposita
500.0en la primera cuenta - Imprime
"After deposit - <name>: "After deposit - <name>: $<balance>"lt;balance>"para la primera cuenta - Transfiere
300.0de la primera cuenta a la segunda usando la función friend - Imprime
"After transfer:" - Imprime
" <name>: " <name>: $<balance>"lt;balance>"para la primera cuenta - Imprime
" <name>: " <name>: $<balance>"lt;balance>"para la segunda cuenta - Imprime
"Query count for <name>: <count>"para la primera cuenta
- Crea dos objetos
Formatea todos los valores de saldo con dos decimales usando std::fixed y std::setprecision(2) de <iomanip>. Convierte las entradas de saldo de strings a doubles usando std::stod().
No olvides los protectores de inclusión (header guards) en tu archivo de cabecera e incluir <string> y <iostream> donde sea necesario.
Pruébalo tú mismo
#include <iostream>
#include <string>
#include <iomanip>
#include "BankAccount.h"
int main() {
// Leer entrada
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);
// Establecer el formato de salida para 2 decimales
std::cout << std::fixed << std::setprecision(2);
// TODO: Crear dos objetos BankAccount con los números de cuenta "ACC001" y "ACC002"
// TODO: Imprimir "Total accounts: <count>"
// TODO: Imprimir "<name>: $<balance>" para la primera cuenta
// TODO: Imprimir "<name>: $<balance>" para la segunda cuenta
// TODO: Depositar 500.0 en la primera cuenta
// TODO: Imprimir "After deposit - <name>: $<balance>" para la primera cuenta
// TODO: Transferir 300.0 de la primera cuenta a la segunda usando la función friend
// TODO: Imprimir "After transfer:"
// TODO: Imprimir " <name>: $<balance>" para la primera cuenta (notar la sangría de 2 espacios)
// TODO: Imprimir " <name>: $<balance>" para la segunda cuenta (notar la sangría de 2 espacios)
// TODO: Imprimir "Query count for <name>: <count>" para la primera cuenta
return 0;
}
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosConstrucción y compilación en C++Archivos de cabecera y archivos fuenteNamespaces y alcanceIntroducción a OOP en C++Clases vs ObjetosEl puntero 'this'Métodos (Funciones miembro)Atributos (Miembros de datos)Conceptos básicos de Ctors y DtorsResumen - Calculadora simple4Propiedades de clase
Miembros de instancia vs. estáticosGetters y SettersFunciones miembro constPalabra clave mutableMétodos y variables estáticosFunciones y clases amigasResumen - Gestor de cuentas bancarias7Herencia
Herencia básicaNiveles de acceso en la herenciaOrden de llamada de Ctor y DtorSobrescritura de métodosFunciones virtuales y VTableHerencia múltipleHerencia virtualResumen - Jerarquía de empleados2Gestión de memoria
Memoria Stack vs HeapPunteros y referenciasMemoria dinámica (new/delete)Punteros inteligentes en C++RAII en C++Resumen - Gestor de arrays dinámicos5Encapsulamiento
Especificadores de acceso en C++Especificadores de acceso en profundidadOcultamiento de informaciónStruct vs ClassClases anidadas e internasResumen - Sistema de registros de estudiantes8Polimorfismo
Polimorfismo: Compilación vs. Tiempo de ejecuciónSobrecarga de funcionesFunciones virtuales revisadasFunciones virtuales purasClases abstractasDiseño de interfaces en C++Dynamic Casting y RTTIResumen: Calculadora de figuras11Conceptos avanzados de POO
Composición vs. HerenciaMixins mediante CRTPIdioma PimplBorrado de tiposEnum Classes y tipado fuerteManejo de excepciones en POOJerarquías de excepciones personalizadas14Patrones de diseño - Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositeRAII como patrón3Constructores y Destructores
Constructor por defectoConstructor parametrizadoConstructor de copiaConstructor de movimientoListas de inicialización del constructorConstructores delegadosAnálisis profundo del destructorRegla de tres / cinco / ceroResumen - Clase String6Sobrecarga de operadores
Introducción a la sobrecarga de operadoresSobrecarga de operadores aritméticosSobrecarga de operadores de comparaciónOperadores de flujo (Stream)Sobrecarga del operador de asignaciónSobrecarga de los operadores [] y ()Operadores de conversión de tiposResumen - Clase Matrix9Plantillas
Plantillas de funcionesPlantillas de clasesEspecialización de plantillasPlantillas variádicasConceptos básicos de SFINAE y Type TraitsResumen - Contenedor genérico