Menu
CoddyTech

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.

challenge icon

Desafío

Fácil

Vamos 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. Tu GenericContainer deberí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 indicado
    • getSize(): devuelve el número actual de elementos

    Agrega una plantilla de función llamada printContainer que recibe un GenericContainer<T>& e imprime todos los elementos separados por espacios, seguidos de un salto de línea.

    Crea una especialización de plantilla de printContainer para GenericContainer<bool> que imprima true o false en lugar de 1 o 0.

    Agrega una plantilla de función variádica llamada pushAll que recibe un GenericContainer<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):
    1. Primer entero
    2. Segundo entero
    3. Tercer entero
    4. Un valor double
    5. Un booleano como cadena (true o false)

    Demuestra el funcionamiento de tu contenedor de la siguiente manera:

    1. Crea un GenericContainer<int> con capacidad 10
    2. Usa pushAll para agregar los tres enteros a la vez
    3. Imprime el tamaño: Int container size: <size>
    4. Llama a printContainer para mostrar los enteros
    5. Crea un GenericContainer<double> con capacidad 5
    6. Agrega el valor double y el literal 2.5 mediante llamadas individuales a push
    7. Llama a printContainer para mostrar los valores double
    8. Crea un GenericContainer<bool> con capacidad 5
    9. Agrega la entrada booleana y el literal false
    10. Llama a printContainer para mostrar los valores booleanos (deberían aparecer true/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

Practica por tu cuenta: Compilador de C++ online