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 crear 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 seguro con respecto a los tipos, que puede almacenar elementos dinámicamente y ofrecer operaciones útiles mediante técnicas de plantillas.
Organizarás tu código en dos archivos:
GenericContainer.h: Define aquí tu plantilla de clase. TuGenericContainerdebería:Almacenar elementos dinámicamente mediante un puntero a un arreglo, y llevar un registro del tamaño actual y de la capacidad.
Proporcionar estos métodos principales:
- Un constructor que recibe una capacidad inicial
- Un destructor que libera correctamente la memoria dinámica
push(T value): agrega un elemento al contenedor (supón que la capacidad siempre es suficiente para este desafío)get(size_t index): devuelve el elemento en el índice indicadogetSize(): devuelve el número actual de elementos
Agrega una plantilla de función llamada
printContainerque recibe unGenericContainer<T>&e imprime todos los elementos separados por espacios, seguidos de un salto de línea.Crea una especialización de plantilla de
printContainerparaGenericContainer<bool>que imprimatrueofalseen lugar de1o0.Agrega una plantilla de función variádica llamada
pushAllque recibe unGenericContainer<T>&y cualquier cantidad de valores, y los agrega uno por uno al contenedor mediante una expresión fold. Un fold sobre el operador coma, como(container.push(args), ...);, ejecuta la llamada una vez por cada argumento.main.cpp: Lee cinco entradas (cada una en una línea distinta):- Primer entero
- Segundo entero
- Tercer entero
- Un valor double
- Un booleano como cadena (
trueofalse)
Demuestra el funcionamiento de tu contenedor de la siguiente manera:
- Crea un
GenericContainer<int>con capacidad 10 - Usa
pushAllpara agregar los tres enteros a la vez - Imprime el tamaño:
Int container size: <size> - Llama a
printContainerpara mostrar los enteros - Crea un
GenericContainer<double>con capacidad 5 - Agrega el valor double y el literal
2.5mediante llamadas individuales apush - Llama a
printContainerpara mostrar los valores double - Crea un
GenericContainer<bool>con capacidad 5 - Agrega la entrada booleana y el literal
false - Llama a
printContainerpara mostrar los valores booleanos (deberían aparecertrue/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 imprimir bool de forma personalizada y plantillas variádicas para la función flexible pushAll. Tu contenedor administra su propia memoria siguiendo los principios RAII, lo que demuestra cómo se integran las plantillas con una gestión adecuada de los recursos.
Pruébalo tú mismo
#include <iostream>
#include <string>
#include "GenericContainer.h"
using namespace std;
int main() {
// Lee las entradas
int num1, num2, num3;
double doubleVal;
string boolStr;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> doubleVal;
cin >> boolStr;
// Convierte la cadena a bool
bool boolVal = (boolStr == "true");
// TODO: Crea GenericContainer<int> con capacidad 10
// TODO: Usa pushAll para añadir los tres enteros a la vez
// TODO: Imprime el tamaño: "Int container size: <size>"
// TODO: Llama a printContainer para mostrar los enteros
// TODO: Crea GenericContainer<double> con capacidad 5
// TODO: Añade el valor double y 2.5 mediante llamadas individuales a push
// TODO: Llama a printContainer para mostrar los valores double
// TODO: Crea GenericContainer<bool> con capacidad 5
// TODO: Añade la entrada booleana y false
// TODO: Llama a printContainer para mostrar los valores 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éricoPractica por tu cuenta: Compilador de C++ online