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 a tipos, capaz de armazenar elementos dinamicamente e oferecer operações úteis por meio de técnicas de modelos.
Você organizará seu código em dois arquivos:
GenericContainer.h: defina aqui seu modelo de classe. SeuGenericContainerdeve:Armazenar elementos dinamicamente usando um ponteiro para um array, além de acompanhar o tamanho atual e a capacidade.
Fornecer estes métodos principais:
- 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 fornecidogetSize(): retorna a quantidade 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 quebra de 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, inserindo cada um no contêiner usando uma expressão fold. Uma fold sobre o operador vírgula, como(container.push(args), ...);, executa a chamada uma vez para cada argumento.main.cpp: leia cinco entradas (cada uma em uma linha separada):- Primeiro número inteiro
- Segundo número inteiro
- Terceiro número inteiro
- Um valor double
- Um booleano como string (
trueoufalse)
Demonstre seu contêiner fazendo o seguinte:
- Criar um
GenericContainer<int>com capacidade 10 - Usar
pushAllpara adicionar os três números inteiros de uma só vez - Imprimir o tamanho:
Int container size: <size> - Chamar
printContainerpara exibir os números inteiros - Criar um
GenericContainer<double>com capacidade 5 - Inserir o valor double e o literal
2.5usando chamadas individuais depush - Chamar
printContainerpara exibir os valores double - Criar um
GenericContainer<bool>com capacidade 5 - Inserir a entrada booleana e o literal
false - Chamar
printContainerpara exibir os valores 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 modelo para a impressão personalizada de valores bool e modelos variádicos para a função flexível pushAll. Seu contêiner gerencia a própria memória seguindo os princípios 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() {
// Leia as entradas
int num1, num2, num3;
double doubleVal;
string boolStr;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> doubleVal;
cin >> boolStr;
// Converta a string para bool
bool boolVal = (boolStr == "true");
// TODO: Crie GenericContainer<int> com capacidade 10
// TODO: Use pushAll para adicionar os três números inteiros de uma vez
// TODO: Imprima o tamanho: "Int container size: <size>"
// TODO: Chame printContainer para exibir os números inteiros
// TODO: Crie GenericContainer<double> com capacidade 5
// TODO: Adicione o valor double e 2.5 usando chamadas individuais a push
// TODO: Chame printContainer para exibir os valores double
// TODO: Crie GenericContainer<bool> com capacidade 5
// TODO: Adicione a entrada booleana e false
// TODO: Chame printContainer para exibir os valores booleanos
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