From 50cc98b04e93c0e6a990dd07ecb9bf6cacb7098a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20M=C3=A9ndez?= <45081533+FerMdez@users.noreply.github.com> Date: Sun, 9 Feb 2020 13:28:03 +0100 Subject: [PATCH] =?UTF-8?q?Clases=20y=20Memoria=20Din=C3=A1mica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Un ejemplo de uso de clases y memoria dinámica en C++ --- Clases y memoria dinámica/ListaPersonas.cpp | 60 +++++++++++++-------- Clases y memoria dinámica/ListaPersonas.h | 42 +++++++++------ Clases y memoria dinámica/main.cpp | 16 +++--- Clases y memoria dinámica/persona.cpp | 7 ++- Clases y memoria dinámica/persona.h | 8 ++- 5 files changed, 85 insertions(+), 48 deletions(-) diff --git a/Clases y memoria dinámica/ListaPersonas.cpp b/Clases y memoria dinámica/ListaPersonas.cpp index 10cd527..4bcfa5b 100644 --- a/Clases y memoria dinámica/ListaPersonas.cpp +++ b/Clases y memoria dinámica/ListaPersonas.cpp @@ -1,37 +1,51 @@ +/* + Fernando Méndez + https://fernmend.ddns.net + C++ | Clases y memoria dinámica. +*/ + + #include "ListaPersonas.h" using namespace std; -void iniciar(tListaPersonas& lista) { - lista.capacidad = 2; - lista.contador = 0; - lista.persona = new Persona * [lista.capacidad]; //Crea una lista de punteros (que en un futuro, apuntarán cada uno a "tPersona"). + +ListaPersonas::ListaPersonas(){ + _capacidad = 2; + _contador = 0; + _persona = new Persona * [_capacidad]; //Crea una lista de punteros (que en un futuro, apuntarán cada uno a una Persona(clase)). } -void ampliar(tListaPersonas& lista) { - lista.capacidad *= 2; - Persona** aux = new Persona * [lista.capacidad]; +inline ListaPersonas::ListaPersonas(int capacidad){ + _capacidad = capacidad; + _contador = 0; + _persona = new Persona * [_capacidad]; //Crea una lista de punteros (que en un futuro, apuntarán cada uno a una Persona(clase)). +} - for (int i = 0; i < lista.contador; i++) { - aux[i] = lista.persona[i]; +void ListaPersonas::ampliar() { + _capacidad *= 2; + Persona** aux = new Persona * [_capacidad]; + + for (int i = 0; i < _contador; i++) { + aux[i] = _persona[i]; } - delete[] lista.persona; - lista.persona = aux; + delete[] _persona; + _persona = aux; } -void liberar(tListaPersonas& lista) { - for (int i = 0; i < lista.contador; i++) { - delete lista.persona[i]; +void ListaPersonas::liberar() { + for (int i = 0; i < _contador; i++) { + delete _persona[i]; } - delete[] lista.persona; + delete[] _persona; } -void agregar(tListaPersonas& lista) { +void ListaPersonas::agregar() { string nombre, apellidos, NIF, edad; do { - if (lista.contador == lista.capacidad) { ampliar(lista); } + if (_contador == _capacidad) { ampliar(); } cout << "Introduzca nombre de persona: " << endl; getline(cin, nombre); cout << "Introduzca apellidos: " << endl; @@ -40,22 +54,22 @@ void agregar(tListaPersonas& lista) { getline(cin, NIF); cout << "Introduzca edad: " << endl; getline(cin, edad); - lista.persona[lista.contador] = new Persona(nombre, apellidos, NIF, edad); - lista.contador++; + _persona[_contador] = new Persona(nombre, apellidos, NIF, edad); + _contador++; cout << "Pulse 'ESC' para SALIR, 'ENTER' para continuar..." << endl; } while (!salir()); } -void mostrar(tListaPersonas& lista) { +void ListaPersonas::mostrar() { cout << setw(10) << right << "NOMBRE" << setw(20) << "APELLIDOS" << setw(20) << "NIF" << setw(15) << "EDAD" << endl; cout << setw(75) << setfill('=') << "\n" << setfill(char(0)); - for (int i = 0; i < lista.contador; i++) { - lista.persona[i]->mostrar(); + for (int i = 0; i < _contador; i++) { + _persona[i]->mostrar(); cout << endl; } } -bool salir() { +bool ListaPersonas::salir() { int tecla = 27; bool ESC = false; diff --git a/Clases y memoria dinámica/ListaPersonas.h b/Clases y memoria dinámica/ListaPersonas.h index 9cab3c5..f21a530 100644 --- a/Clases y memoria dinámica/ListaPersonas.h +++ b/Clases y memoria dinámica/ListaPersonas.h @@ -1,3 +1,9 @@ +/* + Fernando Méndez + https://fernmend.ddns.net + C++ | Clases y memoria dinámica. +*/ + #ifndef _LISTA #define _LISTA @@ -6,22 +12,26 @@ #include #include "persona.h" -//Constantes: +class ListaPersonas{ +public: + //Constructoras: + ListaPersonas(); + ListaPersonas(int); + + //Métodos públicos: + void liberar(); //Libera la memoria dinámica. + void agregar(); //Añade objectos de la clase Persona a la lista. + void mostrar(); //Muestra la lista de personas. + +private: + //Atributos: + Persona** _persona; + int _capacidad, _contador; + + //Métodos privados: + void ampliar(); //Amplia la lista en caso de que se alcance la máxima capacidad. + bool salir(); //Lee una tecla. Si es "ESC", devuleve true (false en caso contratio). -//Tipos: -typedef struct tListaPersonas { - Persona** persona; - int contador; - int capacidad; }; -//Funciones: -void iniciar(tListaPersonas&); //Inicializa una lista dinámica de la clase Persona, con un contador a '0' y una capacidad inicial de '2'. -void ampliar(tListaPersonas&); //Amplia la lista en caso de que se alcance la capacidad máxima. -void liberar(tListaPersonas&); //Libera la memoria dinámica. -void agregar(tListaPersonas&); //Método para agregar una nueva persona a la lista. -void mostrar(tListaPersonas&); //Muestra la lista de personas. -bool salir(); //Lee una tecla, devuelve true si la tecla es "ESC". - -#endif // !_LISTA - +#endif // !_LISTA \ No newline at end of file diff --git a/Clases y memoria dinámica/main.cpp b/Clases y memoria dinámica/main.cpp index 6f18477..e6990dc 100644 --- a/Clases y memoria dinámica/main.cpp +++ b/Clases y memoria dinámica/main.cpp @@ -1,3 +1,9 @@ +/* + Fernando Méndez + https://fernmend.ddns.net + C++ | Clases y memoria dinámica. +*/ + #include "ListaPersonas.h" #include "checkML.h" @@ -5,14 +11,12 @@ int main() { _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); //Detecta posibles fugas de memoria. - tListaPersonas personas; + ListaPersonas lista = ListaPersonas(); - iniciar(personas); - - agregar(personas); - mostrar(personas); + lista.agregar(); + lista.mostrar(); system("PAUSE"); - liberar(personas); + lista.liberar(); return 0; } \ No newline at end of file diff --git a/Clases y memoria dinámica/persona.cpp b/Clases y memoria dinámica/persona.cpp index 46a5f14..0868f75 100644 --- a/Clases y memoria dinámica/persona.cpp +++ b/Clases y memoria dinámica/persona.cpp @@ -1,3 +1,9 @@ +/* + Fernando Méndez + https://fernmend.ddns.net + C++ | Clases y memoria dinámica. +*/ + #include "persona.h" using namespace std; @@ -15,7 +21,6 @@ Persona::Persona(std::string nombre, std::string apellidos, std::string NIF, std _edad = edad; } - void Persona::mostrar() { cout << setw(10) << right << this->_nombre << setw(20) diff --git a/Clases y memoria dinámica/persona.h b/Clases y memoria dinámica/persona.h index 4e5a77b..86afce3 100644 --- a/Clases y memoria dinámica/persona.h +++ b/Clases y memoria dinámica/persona.h @@ -1,3 +1,9 @@ +/* + Fernando Méndez + https://fernmend.ddns.net + C++ | Clases y memoria dinámica. +*/ + #ifndef _Persona #define _Persona @@ -17,8 +23,6 @@ public: private: //Atributos: std::string _nombre, _apellidos, _NIF, _edad; - - //Métodos privados: }; #endif // !_Persona