Clases y Memoria Dinámica

Un ejemplo de uso de clases y memoria dinámica en C++
This commit is contained in:
Fernando Méndez 2020-02-09 13:28:03 +01:00 committed by GitHub
parent e7d99b54d9
commit 50cc98b04e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 85 additions and 48 deletions

View File

@ -1,37 +1,51 @@
/*
Fernando Méndez
https://fernmend.ddns.net
C++ | Clases y memoria dinámica.
*/
#include "ListaPersonas.h" #include "ListaPersonas.h"
using namespace std; using namespace std;
void iniciar(tListaPersonas& lista) {
lista.capacidad = 2; ListaPersonas::ListaPersonas(){
lista.contador = 0; _capacidad = 2;
lista.persona = new Persona * [lista.capacidad]; //Crea una lista de punteros (que en un futuro, apuntarán cada uno a "tPersona"). _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) { inline ListaPersonas::ListaPersonas(int capacidad){
lista.capacidad *= 2; _capacidad = capacidad;
Persona** aux = new Persona * [lista.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++) { void ListaPersonas::ampliar() {
aux[i] = lista.persona[i]; _capacidad *= 2;
Persona** aux = new Persona * [_capacidad];
for (int i = 0; i < _contador; i++) {
aux[i] = _persona[i];
} }
delete[] lista.persona; delete[] _persona;
lista.persona = aux; _persona = aux;
} }
void liberar(tListaPersonas& lista) { void ListaPersonas::liberar() {
for (int i = 0; i < lista.contador; i++) { for (int i = 0; i < _contador; i++) {
delete lista.persona[i]; delete _persona[i];
} }
delete[] lista.persona; delete[] _persona;
} }
void agregar(tListaPersonas& lista) { void ListaPersonas::agregar() {
string nombre, apellidos, NIF, edad; string nombre, apellidos, NIF, edad;
do { do {
if (lista.contador == lista.capacidad) { ampliar(lista); } if (_contador == _capacidad) { ampliar(); }
cout << "Introduzca nombre de persona: " << endl; cout << "Introduzca nombre de persona: " << endl;
getline(cin, nombre); getline(cin, nombre);
cout << "Introduzca apellidos: " << endl; cout << "Introduzca apellidos: " << endl;
@ -40,22 +54,22 @@ void agregar(tListaPersonas& lista) {
getline(cin, NIF); getline(cin, NIF);
cout << "Introduzca edad: " << endl; cout << "Introduzca edad: " << endl;
getline(cin, edad); getline(cin, edad);
lista.persona[lista.contador] = new Persona(nombre, apellidos, NIF, edad); _persona[_contador] = new Persona(nombre, apellidos, NIF, edad);
lista.contador++; _contador++;
cout << "Pulse 'ESC' para SALIR, 'ENTER' para continuar..." << endl; cout << "Pulse 'ESC' para SALIR, 'ENTER' para continuar..." << endl;
} while (!salir()); } 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(10) << right << "NOMBRE" << setw(20) << "APELLIDOS" << setw(20) << "NIF" << setw(15) << "EDAD" << endl;
cout << setw(75) << setfill('=') << "\n" << setfill(char(0)); cout << setw(75) << setfill('=') << "\n" << setfill(char(0));
for (int i = 0; i < lista.contador; i++) { for (int i = 0; i < _contador; i++) {
lista.persona[i]->mostrar(); _persona[i]->mostrar();
cout << endl; cout << endl;
} }
} }
bool salir() { bool ListaPersonas::salir() {
int tecla = 27; int tecla = 27;
bool ESC = false; bool ESC = false;

View File

@ -1,3 +1,9 @@
/*
Fernando Méndez
https://fernmend.ddns.net
C++ | Clases y memoria dinámica.
*/
#ifndef _LISTA #ifndef _LISTA
#define _LISTA #define _LISTA
@ -6,22 +12,26 @@
#include <conio.h> #include <conio.h>
#include "persona.h" #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: #endif // !_LISTA
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

View File

@ -1,3 +1,9 @@
/*
Fernando Méndez
https://fernmend.ddns.net
C++ | Clases y memoria dinámica.
*/
#include "ListaPersonas.h" #include "ListaPersonas.h"
#include "checkML.h" #include "checkML.h"
@ -5,14 +11,12 @@
int main() { int main() {
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); //Detecta posibles fugas de memoria. _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); //Detecta posibles fugas de memoria.
tListaPersonas personas; ListaPersonas lista = ListaPersonas();
iniciar(personas); lista.agregar();
lista.mostrar();
agregar(personas);
mostrar(personas);
system("PAUSE"); system("PAUSE");
liberar(personas); lista.liberar();
return 0; return 0;
} }

View File

@ -1,3 +1,9 @@
/*
Fernando Méndez
https://fernmend.ddns.net
C++ | Clases y memoria dinámica.
*/
#include "persona.h" #include "persona.h"
using namespace std; using namespace std;
@ -15,7 +21,6 @@ Persona::Persona(std::string nombre, std::string apellidos, std::string NIF, std
_edad = edad; _edad = edad;
} }
void Persona::mostrar() { void Persona::mostrar() {
cout << setw(10) << right cout << setw(10) << right
<< this->_nombre << setw(20) << this->_nombre << setw(20)

View File

@ -1,3 +1,9 @@
/*
Fernando Méndez
https://fernmend.ddns.net
C++ | Clases y memoria dinámica.
*/
#ifndef _Persona #ifndef _Persona
#define _Persona #define _Persona
@ -17,8 +23,6 @@ public:
private: private:
//Atributos: //Atributos:
std::string _nombre, _apellidos, _NIF, _edad; std::string _nombre, _apellidos, _NIF, _edad;
//Métodos privados:
}; };
#endif // !_Persona #endif // !_Persona