Repaso: gestor de arreglos 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ácilVamos a crear una clase DynamicArray que gestione su propia memoria y crezca automáticamente cuando sea necesario, ¡igual que funciona std::vector internamente!
Crearás dos archivos para organizar tu código:
DynamicArray.h: Define una claseDynamicArrayque gestione una matriz de enteros de tamaño dinámico. Tu clase debe tener:- Miembros privados: un puntero a la matriz de datos, el tamaño actual (número de elementos) y la capacidad (espacio asignado)
- Un constructor que reciba una capacidad inicial, asigne la matriz en el heap e inicialice el tamaño en 0
- Un destructor que libere la memoria asignada e imprima
"DynamicArray destroyed" - Un método
push(int value)que añada un elemento a la matriz. Si la matriz está llena, debe duplicar la capacidad asignando una nueva matriz más grande, copiando los elementos existentes y liberando la matriz anterior - Un método
get(size_t index)que devuelva el elemento en el índice indicado - 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 la cantidad de valores que se añadirán. Después, 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 que se añadirán (entero)
- Líneas siguientes: un valor entero por línea
Al cambiar el tamaño, tu matriz debe duplicar su capacidad. Por ejemplo, si empiezas con una capacidad de 2 y añades un tercer elemento, la capacidad debe pasar a ser 4. Esto demuestra el principio RAII. Tu clase adquiere memoria en el constructor y la libera en el destructor, lo que garantiza que no haya fugas de memoria.
Incluye tu archivo de encabezado en main.cpp usando #include "DynamicArray.h".
Pruébalo tú mismo
#include <iostream>
#include "DynamicArray.h"
using namespace std;
int main() {
// Lee la capacidad inicial
int initialCapacity;
cin >> initialCapacity;
// Lee la cantidad de valores que se agregarán
int numValues;
cin >> numValues;
// TODO: Crea un DynamicArray con la capacidad inicial
// TODO: Lee numValues enteros y agrega cada uno al arreglo
// TODO: Imprime "Size: <size>"
// TODO: Imprime "Capacity: <capacity>"
// TODO: Imprime "Elements: <e1> <e2> ..." (todos los elementos separados por espacios)
return 0;
}
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de la POO
Archivos externosCompilación y construcción en C++Archivos de cabecera y archivos fuenteEspacios de nombres y ámbitoIntroducción a la POO en C++Clases y objetosEl puntero 'this'Métodos (funciones miembro)Atributos (miembros de datos)Fundamentos de constructores y destructoresRepaso: calculadora sencilla4Propiedades de clase
Miembros de instancia vs. estáticosGetters y settersFunciones miembro constPalabra clave mutableMétodos y variables estáticosFunciones y clases friendRepaso: gestor de cuentas bancarias7Herencia
Herencia básicaNiveles de acceso en la herenciaOrden de llamada de constructores y destructoresSobrescritura de métodosFunciones virtuales y VTableHerencia múltipleHerencia virtualRepaso: jerarquía de empleados2Gestión de memoria
Memoria de pila vs. heapPunteros y referenciasMemoria dinámica (new/delete)Punteros inteligentes en C++RAII en C++Repaso: gestor de arreglos dinámicos5Encapsulación
Especificadores de acceso en C++Especificadores de acceso en profundidadOcultación de informaciónStruct vs. classClases anidadas e internasRepaso: sistema de registros de estudiantes8Polimorfismo
Polimorfismo en compilación y en tiempo de ejecuciónSobrecarga de funcionesRepaso de las funciones virtualesFunciones virtuales purasClases abstractasDiseño de interfaces en C++Conversión dinámica y RTTIRepaso: calculadora de formas11Conceptos avanzados de POO
Composición frente a herenciaMixins mediante CRTPIdiom PimplBorrado de tiposClases enum 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 predeterminadoConstructor con parámetrosConstructor de copiaConstructor de movimientoListas de inicialización del constructorConstructores delegadosAnálisis detallado del destructorRegla de tres / cinco / ceroRepaso: clase String6Sobrecarga de operadores
Introducción a la sobrecarga de operadoresSobrecarga de operadores aritméticosSobrecarga de operadores de comparaciónOperadores de flujoSobrecarga del operador de asignaciónSobrecarga de los operadores [] y ()Operadores de conversión de tipoRepaso: clase Matrix9Plantillas
Plantillas de funcionesPlantillas de clasesEspecialización de plantillasPlantillas variádicasFundamentos de SFINAE y rasgos de tiposRepaso: contenedor genéricoPractica por tu cuenta: Compilador de C++ online