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ácilConstruyamos una plantilla de clase GenericContainer que reúna todo lo que has aprendido sobre las plantillas en este capítulo. Crearás un contenedor flexible y seguro en cuanto a tipos que pueda almacenar elementos dinámicamente y proporcionar operaciones útiles mediante técnicas de plantillas.
Organizarás tu código en dos archivos:
GenericContainer.h: Define aquí tu plantilla de clase. TuGenericContainerdebe:Almacenar elementos dinámicamente mediante un puntero a un arreglo, además de realizar un seguimiento del tamaño y la capacidad actuales.
Proporcionar estos métodos principales:
- Un constructor que acepte una capacidad inicial
- Un destructor que libere correctamente la memoria dinámica
push(T value): añade 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
Añade una plantilla de función llamada
printContainerque acepte unGenericContainer<T>&e imprima 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.Añade una plantilla de función variádica llamada
pushAllque acepte unGenericContainer<T>&y cualquier cantidad de valores, insertando cada uno en el contenedor mediante una expresión fold.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 de la siguiente manera:
- Crea un
GenericContainer<int>con capacidad 10 - Usa
pushAllpara añadir 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 - Añade el valor double y el literal
2.5usando llamadas individuales apush - Llama a
printContainerpara mostrar los valores double - Crea un
GenericContainer<bool>con capacidad 5 - Añade la entrada booleana y el literal
false - Llama a
printContainerpara mostrar los booleanos (debería 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 valores bool y plantillas variádicas para la función flexible pushAll. Tu contenedor administra su propia memoria siguiendo los principios de RAII, lo que demuestra cómo las plantillas se integran con una gestión adecuada de recursos.
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 agregar los tres enteros a la vez
// TODO: Print the size: "Int container size: <size>"
// TODO: Call printContainer to display the integers
// TODO: Crear GenericContainer<double> con capacidad 5
// TODO: Hacer push del valor double y 2.5 usando llamadas push individuales
// TODO: Call printContainer to display the doubles
// TODO: Crear GenericContainer<bool> con capacidad 5
// TODO: Hacer push de la entrada booleana y false
// TODO: Call printContainer to display the booleans
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