Se trata de un agenda de contactos, donde debo guardar , mostrar y buscar. Todo eso practicamente está hecho pero a la hora de guardar un nuevo contacto debo hacerlo de una forma especifica para cumplir con los objetivos de la práctica.
El problema es que tengo que añadir un contacto nuevo haciendo miagenda+=micontacto en la linea 248, como veis tengo que emplear la sobrecarga de operadores y lo máximo que he conseguido es haciendo miagenda++. No consigo aclararme muy bien con este tema de sobrecarga de operadores y atributos dinamicos. A ver si podéis echarme una mano. Gracias
Código C++:
Ver original
#include <iostream> #include <conio.h> #include <stdlib.h> #include <fstream> using namespace std; class fecha{ private: int dd,mm,aa; bool valido; public: // solicitamos al usuario los datos de fecha friend istream& operator >> (istream &medio, fecha &f2){ do{ cout << "Introduce el dia: "; medio >> f2.dd; medio.ignore(); cout << "Introduce el mes: "; medio >> f2.mm; medio.ignore(); cout << "Introduce el anyo: "; medio >> f2.aa; medio.ignore(); f2.valido=f2.comprobar(); }while (f2.valido==false); return(medio); } //mostramos al usuario los datos de fecha friend ostream& operator << (ostream &medio, fecha f2){ medio << f2.dd << "/" << f2.mm << "/" << f2.aa << endl; return(medio); } //comprobamos si la fecha es correcta bool comprobar (){ valido=true; if (dd<1 || dd>31) valido=false; if (mm<1 || mm>12) valido=false; if (aa<1950 || aa>2011) valido=false; return (valido); } }; class direccion{ private: string calle, localidad; int numero; public: //solicitamos al usuario los datos de direccion friend istream& operator >> (istream &medio, direccion &d2){ cout << "Introduce la calle: ";getline (medio,d2.calle); cout << "Introuce el numero: "; medio >> d2.numero; medio.ignore(); cout << "Introduce la localidad: "; getline (medio,d2.localidad); return(medio); } //mostramos al usuario los datos de direccion friend ostream& operator << (ostream &medio, direccion d2){ cout << "Calle: "; medio << d2.calle << endl; cout << "Numero: "; medio << d2.numero << endl; cout << "Localidad: "; medio << d2.localidad << endl; return(medio); } }; class contacto{ friend class agenda; friend class menu; private: fecha f1; direccion d1; string nombre, apellidos; public: //solicitamos los datos del contacto friend istream& operator >> (istream &medio, contacto &c1){ cout <<"Introduce el nombre: "; getline (medio,c1.nombre); cout << "Introduce los apellidos: "; getline (medio,c1.apellidos); medio >> c1.f1; medio >> c1.d1; return(medio); } //mostramos los datos del contacto friend ostream& operator << (ostream &medio, contacto c1){ cout << "Nombre: "; medio << c1.nombre<< endl; cout << "Apellidos: "; medio << c1.apellidos<< endl; medio << c1.f1; medio << c1.d1; cout << endl; return(medio); } }; class agenda{ private: string buscarnombre; contacto *lista; bool centinela; int n; public: //constructor de agenda agenda (){ cout << "constructor agenda" << endl; if (n<0){ n=0; lista = NULL; } centinela=true; return; } //destructor de agenda ~agenda (){ cout << "destructor de agenda" << endl; if (lista!=NULL) delete []lista; return; } //constructor de copia de agenda agenda (const agenda &copialista){ cout << "constructor de copia" << endl; n=copialista.n; lista= new contacto[n]; for (int i=0; i<n; i++){ lista[i]=copialista.lista[i]; } return; } //añadir un contacto a la agenda void operator+= (agenda micontacto1) void operator++(int){ // creamos un objeto vector auxiliar de la clase contacto y le asignamos un tamaño mayor que el actual // de la lista de contactos contacto *aux=new contacto [n+1]; //copiamos el contenido de la lista de contactos en el vector auxiliar for (int i=0;i<n;i++){ aux[i]=lista[i]; } // borramos el vector de la lista de contactos delete []lista; //igualamos ambos vectores lista=aux; // metemos el nuevo contacto en eñ vector de la lista de contactos cout << "operador de carga" << endl; cin >> lista[n]; //incrementamos el numero de la lista de contactos para su proxima ejecucion n++; return; } //mostrar todos los contactos de la agenda friend ostream& operator << (ostream &medio, agenda ag1){ if (ag1.n==0){ cout << "La lista de contactos esta vacia" << endl; }else{ for (int i=0;i<ag1.n;i++)cout << ag1.lista[i]; } cout << endl << "Presiona una tecla para volver al menu"; return(medio); } // buscar un contacto en la agenda void buscar (void){ if (lista!=NULL){ cout << "Introduce el nombre del contacto: "; getline (cin,buscarnombre); for (int i=0;i<n;i++){ if (lista[i].nombre==buscarnombre){ cout << endl; cout << lista[i]; centinela=false; } } if (centinela==true){ cout << endl << "No existe ningun contacto con ese nombre"; } } cout << endl << "Presiona una tecla para volver al menu"; return; } }; class menu{ private: agenda miagenda; int eleccion; public: int solicitar (void){ do{ cout << "1- Nuevo contacto" << endl; cout << "2- Listar contactos" << endl; cout << "3- Buscar contacto" << endl; cout << "4- Salir" << endl << endl; cout << "Introduce tu eleccion: "; cin >> eleccion; cin.ignore(); }while (eleccion<1 || eleccion>4); return (eleccion); } void seleccion (void){ do{ eleccion=solicitar(); switch(eleccion){ case 1: miagenda++; break; case 2: cout << miagenda; break; case 3: miagenda.buscar(); break; } }while (eleccion!=4); } }; int main (void){ menu m1; m1.seleccion(); return(0); }