Resumen - Gestor de arrays dinámicos
Parte de la sección Programación Orientada a Objetos del Journey de C++ de Coddy — lección 17 de 104.
Desafío
Fácil¡Vamos a construir una clase DynamicArray que gestione su propia memoria, creciendo automáticamente cuando sea necesario — tal como funciona std::vector internamente!
Crearás dos archivos para organizar tu código:
DynamicArray.h: Define una claseDynamicArrayque gestione un arreglo de enteros de tamaño dinámico. Tu clase debe tener:- Miembros privados: un puntero al arreglo de datos, el tamaño actual (número de elementos) y la capacidad (espacio asignado)
- Un constructor que reciba una capacidad inicial, asigne el arreglo en el heap e inicialice el tamaño a 0
- Un destructor que libere la memoria asignada e imprima
"DynamicArray destroyed" - Un método
push(int value)que añada un elemento al arreglo. Si el arreglo está lleno, debe duplicar la capacidad asignando un nuevo arreglo más grande, copiando los elementos existentes y liberando el arreglo antiguo - Un método
get(size_t index)que devuelva el elemento en el índice dado - Un método
getSize()que devuelva el número actual de elementos - Un método
getCapacity()que devuelva la capacidad actual
main.cpp: Lee una capacidad inicial y una cantidad de valores para añadir. Luego lee esa cantidad de valores enteros y añade cada uno a tu DynamicArray. Después de añadir todos los valores, imprime:"Size: <size>""Capacity: <capacity>""Elements: <e1> <e2> ..."(todos los elementos separados por espacios)
El formato de entrada será:
- Primera línea: capacidad inicial (entero)
- Segunda línea: número de valores a añadir (entero)
- Líneas siguientes: un valor entero por línea
Al redimensionar, tu arreglo debe duplicar su capacidad. Por ejemplo, si comienzas con una capacidad de 2 y añades un tercer elemento, la capacidad debe convertirse en 4. Esto demuestra el principio RAII — tu clase adquiere memoria en el constructor y la libera en el destructor, asegurando que no haya fugas de memoria.
Incluye tu archivo de cabecera en main.cpp usando #include "DynamicArray.h".
Pruébalo tú mismo
#include <iostream>
#include "DynamicArray.h"
using namespace std;
int main() {
// Leer la capacidad inicial
int initialCapacity;
cin >> initialCapacity;
// Leer el número de valores a añadir
int numValues;
cin >> numValues;
// TODO: Crear un DynamicArray con la capacidad inicial
// TODO: Leer numValues enteros y añadir cada uno al arreglo
// TODO: Imprimir "Size: <size>"
// TODO: Imprimir "Capacity: <capacity>"
// TODO: Imprimir "Elements: <e1> <e2> ..." (todos los elementos separados por espacios)
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