Revisão - Gerenciador de Contas Bancárias
Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy. Lição 33 de 104.
Desafio
FácilVamos criar um gerenciador completo de contas bancárias que reúne todos os conceitos de propriedades de classes que você aprendeu neste capítulo: membros privados com getters e setters, funções-membro const, membros mutable, variáveis e métodos static e funções friend.
Você criará dois arquivos para organizar seu código:
BankAccount.h: defina uma classeBankAccountque gerencie os dados da conta com encapsulamento adequado. Sua classe deve ter:- Membros privados:
accountNumber(string),ownerName(string),balance(double) e ummutable int queryCountpara acompanhar quantas vezes o saldo foi consultado - Um membro static privado
totalAccountspara acompanhar quantas contas existem - Um construtor que receba o número da conta, o nome do titular e o saldo inicial. Ele deve inicializar
queryCountcom0e incrementartotalAccounts - Getters const:
getAccountNumber(),getOwnerName()egetBalance(); o getter do saldo deve incrementarqueryCountcada vez que for chamado - Um getter const
getQueryCount()que retorne quantas vezes o saldo foi consultado - Um método
deposit(double amount)que adicione ao saldo somente se o valor for positivo - Um método
withdraw(double amount)que subtraia do saldo somente se o valor for positivo e não exceder o saldo atual - Um método static
getTotalAccounts()que retorne o número total de contas criadas - Declare uma função friend
transfer(BankAccount& from, BankAccount& to, double amount)que mova dinheiro entre as contas. Ela deve transferir somente se o valor for positivo e a conta de origem tiver fundos suficientes
Defina o membro static e a função friend depois da definição da classe.
- Membros privados:
main.cpp: demonstre todos esses recursos funcionando em conjunto. Leia dois nomes de titulares e dois saldos iniciais da entrada (quatro linhas no total: name1, balance1, name2, balance2) e, em seguida:- Crie dois objetos
BankAccountcom os números de conta"ACC001"e"ACC002" - Imprima
"Total accounts: <count>" - Imprima
"<name>: $<balance>"para a primeira conta - Imprima
"<name>: $<balance>"para a segunda conta - Deposite
500.0na primeira conta - Imprima
"After deposit - <name>: $<balance>"para a primeira conta - Transfira
300.0da primeira conta para a segunda usando a função friend - Imprima
"After transfer:" - Imprima
" <name>: $<balance>"para a primeira conta - Imprima
" <name>: $<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 no arquivo de cabeçalho e de incluir <string> e <iostream> onde 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);
// Definir formatação de saída para 2 casas decimais
std::cout << std::fixed << std::setprecision(2);
// TODO: Crie dois objetos BankAccount com números de conta "ACC001" e "ACC002"
// TODO: Print "Total accounts: <count>"
// TODO: Imprima "<name>: $<balance>" para a primeira conta
// TODO: Imprima "<name>: $<balance>" para a segunda conta
// TODO: Deposite 500.0 na primeira conta
// TODO: Print "After deposit - <name>: $<balance>" for the first account
// TODO: Transfira 300.0 da primeira conta para a segunda usando a função friend
// TODO: Print "After transfer:"
// TODO: Imprima " <name>: $<balance>" para a primeira conta (observe a indentação de 2 espaços)
// TODO: Imprima " <name>: $<balance>" para a segunda conta (observe a indentação de 2 espaços)
// TODO: Print "Query count for <name>: <count>" for the first account
return 0;
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos externosBuild e compilação em C++Arquivos de cabeçalho e arquivos-fonteNamespaces e escopoIntrodução à POO em C++Classes vs. objetosO ponteiro 'this'Métodos (funções membro)Atributos (membros de dados)Noções básicas de construtores e destruidoresRevisão - calculadora simples4Propriedades de Classe
Membros de Instância vs. EstáticosGetters e SettersFunções Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRevisão - Gerenciador de Contas Bancárias7Herança
Herança básicaNíveis de acesso da herançaOrdem de chamada de construtor e destrutorSobrescrita de métodosFunções virtuais e VTableHerança múltiplaHerança virtualRevisão - Hierarquia de funcionários10Visão geral da STL
Visão geral e filosofia da STLContêineres da STLIteradoresAlgoritmos da STLFunctors e expressões lambdaRecapitulação - Frequência de palavras13Padrões de Projeto — Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonFactory e Abstract FactoryPadrão BuilderPadrão ObserverPadrão Strategy2Gerenciamento de Memória
Memória Stack vs. HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Ponteiros Inteligentes em C++RAII em C++Revisão - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de acesso em C++Especificadores de acesso em profundidadeOcultação de informaçõesStruct vs ClasseClasses aninhadas e internasRecapitulação - Sistema de registros de alunos8Polimorfismo
Polimorfismo em compilação vs. execuçãoSobrecarga de funçõesFunções virtuais revisadasFunções virtuais purasClasses abstratasDesign de interfaces em C++Conversão dinâmica e RTTIRecapitulação — Calculadora de formas11Conceitos Avançados de OOP
Composição vs. HerançaMixins via CRTPIdioma PimplApagamento de TiposClasses Enum e Tipagem ForteTratamento de Exceções em OOPHierarquias de Exceções Personalizadas14Padrões de Projeto — Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositeRAII como Padrão3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentoListas de Inicialização do ConstrutorConstrutores DelegantesAprofundamento em DestrutoresRegra dos Três / Cinco / ZeroRevisão - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de FluxoSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçõesTemplates de ClassesEspecialização de TemplatesTemplates VariádicosNoções Básicas de SFINAE e Traits de TiposRecapitulação - Contêiner GenéricoPratique por conta própria: Compilador de C++ online