jueves, 24 de septiembre de 2015

Almacenando Punteros de Objetos a 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 punteros a objetos en un Vector.

#include <iostream>
#include <vector>
#include <memory>
#include "Persona.h"

using namespace std;
using std::vector;
using std::unique_ptr;
using std::make_unique;


int main()
{
	//Vector puntero de objetos Persona
	vector<unique_ptr<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.push_back(make_unique<Persona>(nombrePersona, apellidoPersona));
	}

	//Salida del contenido del vector 
	cout << endl;

	for (const auto &p : gente)
		p->mostrarPersona();
	
	system("pause");
}

No hay comentarios:

Publicar un comentario