Herramientas Para el Desarrollo de Videojuegos y Lenguajes de Programación en Español
jueves, 24 de septiembre de 2015
Almacenando objetos en un vector en Visual Studio 2013
Persona.h
//Clase que define el nombre y apellido de una persona
#pragma once
#include <cstring>
#include <iostream>
using namespace std;
class Persona
{
public:
//constructor
Persona(const char *nombre, const char *apellido)
{
iniciarNombre(nombre, apellido);
}
//constructor copia
Persona(const Persona &p)
{
iniciarNombre(p.nombrePersona, p.apellidoPersona);
}
//Mover Constructor
Persona(Persona &&p)
{
nombrePersona = p.nombrePersona;
apellidoPersona = p.apellidoPersona;
//reseteamos el puntero del objeto rvalue para prevenir la destruccion
p.nombrePersona = nullptr;
p.apellidoPersona = nullptr;
}
//Destructor
virtual ~Persona()
{
delete[] nombrePersona;
delete[] apellidoPersona;
}
//Operador de asignacion copia
Persona &operator=(const Persona &p)
{
//Tratamos con p = p en situaciones de asignacion
if (&p != this)
{
delete[] nombrePersona;
delete[] apellidoPersona;
iniciarNombre(p.nombrePersona, p.apellidoPersona);
}
return *this;
}
//operador de asignacion mover
Persona &operator=(Persona &&p)
{
//tratamos con p = p en situaciones de asignacion
if (&p != this)
{
//liberamos la memoria actual
delete[] nombrePersona;
delete[] apellidoPersona;
nombrePersona = p.nombrePersona;
apellidoPersona = p.apellidoPersona;
p.nombrePersona = nullptr;
p.apellidoPersona = nullptr;
}
return *this;
}
//operador <
bool operator<(const Persona &p) const
{
int resultado{ strcmp(apellidoPersona, p.apellidoPersona) };
return (resultado < 0 || resultado == 0 && strcmp(nombrePersona, p.nombrePersona) < 0);
}
//mostrar los datos de la persona
void mostrarPersona() const
{
cout << nombrePersona << " " << apellidoPersona << endl;
}
private:
char *nombrePersona{};
char *apellidoPersona{};
//funcion privada para evitar la duplicacion del codigo
void iniciarNombre(const char *nombre, const char *apellido)
{
size_t tam{ strlen(nombre) + 1 };
nombrePersona = new char[tam];
strcpy_s(nombrePersona, tam, nombre);
tam = strlen(apellido) + 1;
apellidoPersona = new char[tam];
strcpy_s(apellidoPersona, tam, apellido);
}
};
Main.cpp
//Almacenando objetos en un Vector.
#include <iostream>
#include <vector>
#include "Persona.h"
using namespace std;
using std::vector;
int main()
{
//Vector de objetos Persona
vector<Persona> gente;
const size_t tamMax{ 50 };
char nombrePersona[tamMax];
char apellidoPersona[tamMax];
//Entrada de todas las personas
while (true)
{
cout << "Introduce el nombre o presiona enter para terminar: ";
cin.getline(nombrePersona, tamMax, '\n');
if (strlen(nombrePersona) == 0)
break;
cout << "Introduce el apelliido: ";
cin.getline(apellidoPersona, tamMax, '\n');
gente.emplace_back(Persona(nombrePersona, apellidoPersona));
}
//Salida del contenido del vector usando un iterador
cout << endl;
auto iter = cbegin(gente);
while (iter != cend(gente))
{
iter->mostrarPersona();
++iter;
}
system("pause");
}
No hay comentarios:
Publicar un comentario