Recapitulação - Contêiner Genérico
Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy. Lição 69 de 104.
Desafio
FácilVamos criar um modelo de classe GenericContainer que reúne tudo o que você aprendeu sobre modelos neste capítulo. Você criará um contêiner flexível e seguro quanto aos tipos, capaz de armazenar elementos dinamicamente e fornecer operações úteis por meio de técnicas de modelos.
Você organizará seu código em dois arquivos:
GenericContainer.h: defina seu modelo de classe aqui. SeuGenericContainerdeve:Armazenar elementos dinamicamente usando um ponteiro para um array, além de acompanhar o tamanho e a capacidade atuais.
Fornecer estes métodos essenciais:
- Um construtor que recebe uma capacidade inicial
- Um destrutor que libera corretamente a memória dinâmica
push(T value): adiciona um elemento ao contêiner (considere que a capacidade é sempre suficiente para este desafio)get(size_t index): retorna o elemento no índice informadogetSize(): retorna o número atual de elementos
Adicione um modelo de função chamado
printContainerque recebe umGenericContainer<T>&e imprime todos os elementos separados por espaços, seguidos por uma nova linha.Crie uma especialização de modelo de
printContainerparaGenericContainer<bool>que imprimetrueoufalseem vez de1ou0.Adicione um modelo de função variádica chamado
pushAllque recebe umGenericContainer<T>&e qualquer quantidade de valores, adicionando cada um deles ao contêiner usando uma expressão fold.main.cpp: leia cinco entradas (cada uma em uma linha separada):- Primeiro inteiro
- Segundo inteiro
- Terceiro inteiro
- Um valor double
- Um booleano como string (
trueoufalse)
Demonstre seu contêiner:
- Criando um
GenericContainer<int>com capacidade 10 - Usando
pushAllpara adicionar os três inteiros de uma só vez - Imprimindo o tamanho:
Int container size: <size> - Chamando
printContainerpara exibir os inteiros - Criando um
GenericContainer<double>com capacidade 5 - Adicionando o valor double e o literal
2.5usando chamadas individuais depush - Chamando
printContainerpara exibir os valores double - Criando um
GenericContainer<bool>com capacidade 5 - Adicionando a entrada booleana e o literal
false - Chamando
printContainerpara exibir os booleanos (deve mostrartrue/false)
Por exemplo, com as entradas 10, 20, 30, 3.14 e true:
Int container size: 3
10 20 30
3.14 2.5
true false Este desafio combina modelos de classe para o contêiner, especialização de modelos para impressão personalizada de booleanos e modelos variádicos para a função flexível pushAll. Seu contêiner gerencia a própria memória seguindo os princípios de RAII, demonstrando como os modelos se integram ao gerenciamento adequado de recursos.
Experimente você mesmo
#include <iostream>
#include <string>
#include "GenericContainer.h"
using namespace std;
int main() {
// Ler entradas
int num1, num2, num3;
double doubleVal;
string boolStr;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> doubleVal;
cin >> boolStr;
// Converter string para bool
bool boolVal = (boolStr == "true");
// TODO: Criar GenericContainer<int> com capacidade 10
// TODO: Usar pushAll para adicionar todos os três inteiros de uma vez
// TODO: Print the size: "Int container size: <size>"
// TODO: Call printContainer to display the integers
// TODO: Criar GenericContainer<double> com capacidade 5
// TODO: Fazer push do valor double e 2.5 usando chamadas individuais de push
// TODO: Call printContainer to display the doubles
// TODO: Criar GenericContainer<bool> com capacidade 5
// TODO: Fazer push da entrada booleana e false
// TODO: Call printContainer to display the booleans
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