From e7d99b54d9306682ec460a797382b0478b153dd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20M=C3=A9ndez?= <45081533+FerMdez@users.noreply.github.com> Date: Sat, 8 Feb 2020 20:32:39 +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 | 71 +++++++++++++++++++++ Clases y memoria dinámica/ListaPersonas.h | 27 ++++++++ Clases y memoria dinámica/checkML.h | 12 ++++ Clases y memoria dinámica/main.cpp | 18 ++++++ Clases y memoria dinámica/persona.cpp | 25 ++++++++ Clases y memoria dinámica/persona.h | 24 +++++++ 6 files changed, 177 insertions(+) create mode 100644 Clases y memoria dinámica/ListaPersonas.cpp create mode 100644 Clases y memoria dinámica/ListaPersonas.h create mode 100644 Clases y memoria dinámica/checkML.h create mode 100644 Clases y memoria dinámica/main.cpp create mode 100644 Clases y memoria dinámica/persona.cpp create mode 100644 Clases y memoria dinámica/persona.h diff --git a/Clases y memoria dinámica/ListaPersonas.cpp b/Clases y memoria dinámica/ListaPersonas.cpp new file mode 100644 index 0000000..10cd527 --- /dev/null +++ b/Clases y memoria dinámica/ListaPersonas.cpp @@ -0,0 +1,71 @@ +#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"). +} + +void ampliar(tListaPersonas& lista) { + lista.capacidad *= 2; + Persona** aux = new Persona * [lista.capacidad]; + + for (int i = 0; i < lista.contador; i++) { + aux[i] = lista.persona[i]; + } + + delete[] lista.persona; + lista.persona = aux; +} + +void liberar(tListaPersonas& lista) { + for (int i = 0; i < lista.contador; i++) { + delete lista.persona[i]; + } + + delete[] lista.persona; +} + +void agregar(tListaPersonas& lista) { + string nombre, apellidos, NIF, edad; + + do { + if (lista.contador == lista.capacidad) { ampliar(lista); } + cout << "Introduzca nombre de persona: " << endl; + getline(cin, nombre); + cout << "Introduzca apellidos: " << endl; + getline(cin, apellidos); + cout << "Introduzca NIF: " << endl; + getline(cin, NIF); + cout << "Introduzca edad: " << endl; + getline(cin, edad); + lista.persona[lista.contador] = new Persona(nombre, apellidos, NIF, edad); + lista.contador++; + cout << "Pulse 'ESC' para SALIR, 'ENTER' para continuar..." << endl; + } while (!salir()); +} + +void mostrar(tListaPersonas& lista) { + 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(); + cout << endl; + } +} + +bool salir() { + int tecla = 27; + bool ESC = false; + + cin.sync(); + tecla = _getch(); + if (tecla != 0xe0) { + if (tecla == 27) { + ESC = true; + } + } + + return ESC; +} \ No newline at end of file diff --git a/Clases y memoria dinámica/ListaPersonas.h b/Clases y memoria dinámica/ListaPersonas.h new file mode 100644 index 0000000..9cab3c5 --- /dev/null +++ b/Clases y memoria dinámica/ListaPersonas.h @@ -0,0 +1,27 @@ +#ifndef _LISTA +#define _LISTA + +#include +#include +#include +#include "persona.h" + +//Constantes: + +//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 + diff --git a/Clases y memoria dinámica/checkML.h b/Clases y memoria dinámica/checkML.h new file mode 100644 index 0000000..c562ff9 --- /dev/null +++ b/Clases y memoria dinámica/checkML.h @@ -0,0 +1,12 @@ +#ifdef _DEBUG +#define _CRTDBG_MAP_ALLOC + +#include +#include + +#ifndef DBG_NEW +#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ ) +#define new DBG_NEW + +#endif +#endif \ No newline at end of file diff --git a/Clases y memoria dinámica/main.cpp b/Clases y memoria dinámica/main.cpp new file mode 100644 index 0000000..6f18477 --- /dev/null +++ b/Clases y memoria dinámica/main.cpp @@ -0,0 +1,18 @@ +#include "ListaPersonas.h" +#include "checkML.h" + + +int main() { + _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); //Detecta posibles fugas de memoria. + + tListaPersonas personas; + + iniciar(personas); + + agregar(personas); + mostrar(personas); + system("PAUSE"); + + liberar(personas); + 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 new file mode 100644 index 0000000..46a5f14 --- /dev/null +++ b/Clases y memoria dinámica/persona.cpp @@ -0,0 +1,25 @@ +#include "persona.h" +using namespace std; + +Persona::Persona() { + _nombre = "Empty"; + _apellidos = "NULL NULL"; + _NIF = "NULL"; + _edad = "0"; +} + +Persona::Persona(std::string nombre, std::string apellidos, std::string NIF, std::string edad){ + _nombre = nombre; + _apellidos = apellidos; + _NIF = NIF; + _edad = edad; +} + + +void Persona::mostrar() { + cout << setw(10) << right + << this->_nombre << setw(20) + << this->_apellidos << setw(20) + << this->_NIF << setw(15) + << this->_edad; +} \ No newline at end of file diff --git a/Clases y memoria dinámica/persona.h b/Clases y memoria dinámica/persona.h new file mode 100644 index 0000000..4e5a77b --- /dev/null +++ b/Clases y memoria dinámica/persona.h @@ -0,0 +1,24 @@ +#ifndef _Persona +#define _Persona + +#include +#include +#include + +class Persona{ +public: + //Constructoras: + Persona(); + Persona(std::string, std::string, std::string, std::string); + + //Métodos públicos: + void mostrar(); //Muestra los atributos de una persona. + +private: + //Atributos: + std::string _nombre, _apellidos, _NIF, _edad; + + //Métodos privados: +}; + +#endif // !_Persona