Clases y Memoria Dinámica
Un ejemplo de uso de clases y memoria dinámica en C++
This commit is contained in:
parent
e7d99b54d9
commit
50cc98b04e
@ -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++) {
|
|
||||||
aux[i] = lista.persona[i];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete[] lista.persona;
|
void ListaPersonas::ampliar() {
|
||||||
lista.persona = aux;
|
_capacidad *= 2;
|
||||||
|
Persona** aux = new Persona * [_capacidad];
|
||||||
|
|
||||||
|
for (int i = 0; i < _contador; i++) {
|
||||||
|
aux[i] = _persona[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
void liberar(tListaPersonas& lista) {
|
delete[] _persona;
|
||||||
for (int i = 0; i < lista.contador; i++) {
|
_persona = aux;
|
||||||
delete lista.persona[i];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete[] lista.persona;
|
void ListaPersonas::liberar() {
|
||||||
|
for (int i = 0; i < _contador; i++) {
|
||||||
|
delete _persona[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
void agregar(tListaPersonas& lista) {
|
delete[] _persona;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
@ -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:
|
|
||||||
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
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user