Recapitulação - Container 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 construir um template de classe GenericContainer que reúne tudo o que você aprendeu sobre templates neste capítulo. Você criará um contêiner flexível e com segurança de tipos que pode armazenar elementos dinamicamente e fornecer operações úteis por meio de técnicas de template.
Você organizará seu código em dois arquivos:
GenericContainer.h: Defina seu template de classe aqui. SeuGenericContainerdeve:Armazenar elementos dinamicamente usando um ponteiro para um array, além de rastrear o tamanho atual e a capacidade.
Fornecer estes métodos principais:
- Um construtor que recebe uma capacidade inicial
- Um destrutor que limpa adequadamente a memória dinâmica
push(T value)— adiciona um elemento ao contêiner (assuma que a capacidade é sempre suficiente para este desafio)get(size_t index)— retorna o elemento no índice fornecidogetSize()— retorna o número atual de elementos
Adicione um template 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 template de
printContainerparaGenericContainer<bool>que imprimetrueoufalseem vez de1ou0.Adicione um template de função variádica chamado
pushAllque recebe umGenericContainer<T>&e qualquer número de valores, inserindo cada um no contêiner usando uma expressão de dobra (fold expression).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 todos os três inteiros de uma vez - Imprimindo o tamanho:
Int container size: <size> - Chamando
printContainerpara exibir os inteiros - Criando um
GenericContainer<double>com capacidade 5 - Inserindo o valor double e o literal
2.5usando chamadas individuais depush - Chamando
printContainerpara exibir os doubles - Criando um
GenericContainer<bool>com capacidade 5 - Inserindo 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 templates de classe para o contêiner, especialização de template para impressão personalizada de bool e templates variádicos para a função flexível pushAll. Seu contêiner gerencia sua própria memória seguindo os princípios RAII, demonstrando como os templates se integram com o gerenciamento adequado de recursos.
Experimente você mesmo
#include <iostream>
#include <string>
#include "GenericContainer.h"
using namespace std;
int main() {
// Ler as 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: Create GenericContainer<int> with capacity 10
// TODO: Use pushAll to add all three integers at once
// TODO: Print the size: "Int container size: <size>"
// TODO: Call printContainer to display the integers
// TODO: Create GenericContainer<double> with capacity 5
// TODO: Push the double value and 2.5 using individual push calls
// TODO: Call printContainer to display the doubles
// TODO: Create GenericContainer<bool> with capacity 5
// TODO: Push the boolean input and false
// TODO: Call printContainer to display the booleans
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