Recapitulação - Gerenciador de Conta Bancária
Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy — lição 33 de 104.
Desafio
FácilVamos construir um Gerenciador de Conta Bancária completo que reúna todos os conceitos de propriedades de classe que você aprendeu neste capítulo: membros privados com getters e setters, funções membros const, membros mutáveis, variáveis e métodos estáticos e funções amigas (friend functions).
Você criará dois arquivos para organizar seu código:
BankAccount.h: Defina uma classeBankAccountque gerencie os dados da conta com o encapsulamento adequado. Sua classe deve ter:- Membros privados:
accountNumber(string),ownerName(string),balance(double) e ummutable int queryCountpara rastrear quantas vezes o saldo foi verificado - Um membro estático privado
totalAccountspara rastrear quantas contas existem - Um construtor que recebe o número da conta, o nome do proprietário e o saldo inicial. Ele deve inicializar
queryCountcomo0e incrementartotalAccounts - Getters const:
getAccountNumber(),getOwnerName()egetBalance()— o getter do saldo deve incrementarqueryCountcada vez que for chamado - Um getter const
getQueryCount()que retorna quantas vezes o saldo foi verificado - Um método
deposit(double amount)que adiciona ao saldo apenas se o valor for positivo - Um método
withdraw(double amount)que subtrai do saldo apenas se o valor for positivo e não exceder o saldo atual - Um método estático
getTotalAccounts()que retorna o número total de contas criadas - Declare uma função amiga
transfer(BankAccount& from, BankAccount& to, double amount)que move dinheiro entre contas — ela só deve transferir se o valor for positivo e a origem tiver fundos suficientes
Defina o membro estático e a função amiga após a definição da classe.
- Membros privados:
main.cpp: Demonstre todos esses recursos funcionando juntos. Leia dois nomes de proprietários e dois saldos iniciais da entrada (quatro linhas no total: name1, balance1, name2, balance2), então:- Crie dois objetos
BankAccountcom os números de conta"ACC001"e"ACC002" - Imprima
"Total accounts: <count>" - Imprima
"<name>: "<name>: $<balance>"lt;balance>"para a primeira conta - Imprima
"<name>: "<name>: $<balance>"lt;balance>"para a segunda conta - Deposite
500.0na primeira conta - Imprima
"After deposit - <name>: "After deposit - <name>: $<balance>"lt;balance>"para a primeira conta - Transfira
300.0da primeira conta para a segunda usando a função amiga - Imprima
"After transfer:" - Imprima
" <name>: " <name>: $<balance>"lt;balance>"para a primeira conta - Imprima
" <name>: " <name>: $<balance>"lt;balance>"para a segunda conta - Imprima
"Query count for <name>: <count>"para a primeira conta
- Crie dois objetos
Formate todos os valores de saldo com duas casas decimais usando std::fixed e std::setprecision(2) de <iomanip>. Converta as entradas de saldo de strings para doubles usando std::stod().
Não se esqueça dos header guards em seu arquivo de cabeçalho e de incluir <string> e <iostream> onde for necessário.
Experimente você mesmo
#include <iostream>
#include <string>
#include <iomanip>
#include "BankAccount.h"
int main() {
// Ler 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);
// Configurar a formatação de saída para 2 casas decimais
std::cout << std::fixed << std::setprecision(2);
// TODO: Criar dois objetos BankAccount com os números de conta "ACC001" e "ACC002"
// TODO: Imprimir "Total accounts: <count>"
// TODO: Imprimir "<name>: $<balance>" para a primeira conta
// TODO: Imprimir "<name>: $<balance>" para a segunda conta
// TODO: Depositar 500.0 na primeira conta
// TODO: Imprimir "After deposit - <name>: $<balance>" para a primeira conta
// TODO: Transferir 300.0 da primeira conta para a segunda usando a função friend
// TODO: Imprimir "After transfer:"
// TODO: Imprimir " <name>: $<balance>" para a primeira conta (note o recuo de 2 espaços)
// TODO: Imprimir " <name>: $<balance>" para a segunda conta (note o recuo de 2 espaços)
// TODO: Imprimir "Query count for <name>: <count>" para a primeira conta
return 0;
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos ExternosBuild e Compilação em C++Arquivos Header e SourceNamespaces e EscopoIntrodução a OOP em C++Classes vs ObjetosO Ponteiro 'this'Métodos (Funções Membro)Atributos (Membros de Dados)Básico de Ctors e DtorsRecapitulação - Calculadora Simples4Propriedades de Classe
Membros de Instância vs EstáticosGetters e SettersFunções de Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRecapitulação - Gerenciador de Conta Bancária7Herança
Herança BásicaNíveis de Acesso na HerançaOrdem de Chamada de Ctor e DtorSobrescrita de MétodosFunções Virtuais e VTableHerança MúltiplaHerança VirtualRecapitulação - Hierarquia de Funcionários2Gerenciamento de Memória
Memória Stack vs HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Smart Pointers em C++RAII em C++Recapitulação - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de Acesso em C++Especificadores de Acesso em DetalhesOcultação de InformaçãoStruct vs ClassClasses Aninhadas e InternasRecapitulação - Sistema de Registros de Alunos8Polimorfismo
Polimorfismo de Compilação vs Tempo de ExecuçãoSobrecarga de FunçõesFunções Virtuais RevisitadasFunções Virtuais PurasClasses AbstratasDesign de Interfaces em C++Dynamic Casting e RTTIRecapitulação - Calculadora de Formas3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentaçãoListas de Inicialização do ConstrutorConstrutores DelegadosMergulho Profundo em DestrutoresRegra dos Três / Cinco / ZeroRecapitulação - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de StreamSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçãoTemplates de ClasseEspecialização de TemplatesTemplates VariádicosFundamentos de SFINAE e Type TraitsRecapitulação - Container Genérico