Resumen - Contenedor genérico
Parte de la sección Programación Orientada a Objetos del Journey de C++ de Coddy — lección 69 de 104.
Desafío
FácilVamos a construir una plantilla de clase GenericContainer que reúna todo lo que has aprendido sobre plantillas en este capítulo. Crearás un contenedor flexible y de tipo seguro que puede almacenar elementos dinámicamente y proporcionar operaciones útiles a través de técnicas de plantillas.
Organizarás tu código en dos archivos:
GenericContainer.h: Define tu plantilla de clase aquí. TuGenericContainerdebe:Almacenar elementos dinámicamente usando un puntero a un arreglo, además de rastrear el tamaño actual y la capacidad.
Proporcionar estos métodos principales:
- Un constructor que reciba una capacidad inicial
- Un destructor que limpie adecuadamente la memoria dinámica
push(T value)— añade un elemento al contenedor (asume que la capacidad siempre es suficiente para este desafío)get(size_t index)— devuelve el elemento en el índice dadogetSize()— devuelve el número actual de elementos
Añade una plantilla de función llamada
printContainerque reciba unGenericContainer<T>&e imprima todos los elementos separados por espacios, seguidos de una nueva línea.Crea una especialización de plantilla de
printContainerparaGenericContainer<bool>que imprimatrueofalseen lugar de1o0.Añade una plantilla de función variádica llamada
pushAllque reciba unGenericContainer<T>&y cualquier número de valores, insertando cada uno en el contenedor usando una expresión de plegado (fold expression).main.cpp: Lee cinco entradas (cada una en una línea separada):- Primer entero
- Segundo entero
- Tercer entero
- Un valor double
- Un booleano como cadena (
trueofalse)
Demuestra tu contenedor realizando lo siguiente:
- Crear un
GenericContainer<int>con capacidad 10 - Usar
pushAllpara añadir los tres enteros a la vez - Imprimir el tamaño:
Int container size: <size> - Llamar a
printContainerpara mostrar los enteros - Crear un
GenericContainer<double>con capacidad 5 - Insertar el valor double y el literal
2.5usando llamadas individuales apush - Llamar a
printContainerpara mostrar los doubles - Crear un
GenericContainer<bool>con capacidad 5 - Insertar la entrada booleana y el literal
false - Llamar a
printContainerpara mostrar los booleanos (debe mostrartrue/false)
Por ejemplo, con las entradas 10, 20, 30, 3.14, y true:
Int container size: 3
10 20 30
3.14 2.5
true false Este desafío combina plantillas de clase para el contenedor, especialización de plantillas para la impresión personalizada de bool y plantillas variádicas para la función flexible pushAll. Tu contenedor gestiona su propia memoria siguiendo los principios de RAII, demostrando cómo las plantillas se integran con una gestión de recursos adecuada.
Pruébalo tú mismo
#include <iostream>
#include <string>
#include "GenericContainer.h"
using namespace std;
int main() {
// Leer entradas
int num1, num2, num3;
double doubleVal;
string boolStr;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> doubleVal;
cin >> boolStr;
// Convertir string a bool
bool boolVal = (boolStr == "true");
// TODO: Crear GenericContainer<int> con capacidad 10
// TODO: Usar pushAll para añadir los tres enteros a la vez
// TODO: Imprimir el tamaño: "Int container size: <size>"
// TODO: Llamar a printContainer para mostrar los enteros
// TODO: Crear GenericContainer<double> con capacidad 5
// TODO: Hacer push del valor double y 2.5 usando llamadas push individuales
// TODO: Llamar a printContainer para mostrar los doubles
// TODO: Crear GenericContainer<bool> con capacidad 5
// TODO: Hacer push de la entrada booleana y false
// TODO: Llamar a printContainer para mostrar los booleanos
return 0;
}
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosConstrucción y compilación en C++Archivos de cabecera y archivos fuenteNamespaces y alcanceIntroducción a OOP en C++Clases vs ObjetosEl puntero 'this'Métodos (Funciones miembro)Atributos (Miembros de datos)Conceptos básicos de Ctors y DtorsResumen - Calculadora simple4Propiedades de clase
Miembros de instancia vs. estáticosGetters y SettersFunciones miembro constPalabra clave mutableMétodos y variables estáticosFunciones y clases amigasResumen - Gestor de cuentas bancarias7Herencia
Herencia básicaNiveles de acceso en la herenciaOrden de llamada de Ctor y DtorSobrescritura de métodosFunciones virtuales y VTableHerencia múltipleHerencia virtualResumen - Jerarquía de empleados2Gestión de memoria
Memoria Stack vs HeapPunteros y referenciasMemoria dinámica (new/delete)Punteros inteligentes en C++RAII en C++Resumen - Gestor de arrays dinámicos5Encapsulamiento
Especificadores de acceso en C++Especificadores de acceso en profundidadOcultamiento de informaciónStruct vs ClassClases anidadas e internasResumen - Sistema de registros de estudiantes8Polimorfismo
Polimorfismo: Compilación vs. Tiempo de ejecuciónSobrecarga de funcionesFunciones virtuales revisadasFunciones virtuales purasClases abstractasDiseño de interfaces en C++Dynamic Casting y RTTIResumen: Calculadora de figuras11Conceptos avanzados de POO
Composición vs. HerenciaMixins mediante CRTPIdioma PimplBorrado de tiposEnum Classes y tipado fuerteManejo de excepciones en POOJerarquías de excepciones personalizadas14Patrones de diseño - Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositeRAII como patrón3Constructores y Destructores
Constructor por defectoConstructor parametrizadoConstructor de copiaConstructor de movimientoListas de inicialización del constructorConstructores delegadosAnálisis profundo del destructorRegla de tres / cinco / ceroResumen - Clase String6Sobrecarga de operadores
Introducción a la sobrecarga de operadoresSobrecarga de operadores aritméticosSobrecarga de operadores de comparaciónOperadores de flujo (Stream)Sobrecarga del operador de asignaciónSobrecarga de los operadores [] y ()Operadores de conversión de tiposResumen - Clase Matrix9Plantillas
Plantillas de funcionesPlantillas de clasesEspecialización de plantillasPlantillas variádicasConceptos básicos de SFINAE y Type TraitsResumen - Contenedor genérico