Ver Mensaje Individual
  #1 (permalink)  
Antiguo 13/03/2011, 16:11
fingeroso
 
Fecha de Ingreso: marzo-2011
Mensajes: 13
Antigüedad: 13 años, 8 meses
Puntos: 0
Problema con sobrecarga operadores +=

Buenas a todos, soy nuevo y tengo un problema con un programa que no consigo completar.
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
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. #include <fstream>
  5.  
  6. using namespace std;
  7.  
  8.  
  9. class fecha{
  10.  
  11. private:
  12.     int dd,mm,aa;
  13.     bool valido;
  14. public:
  15.  
  16.         // solicitamos al usuario los datos de fecha
  17.     friend istream& operator >> (istream &medio, fecha &f2){
  18.         do{
  19.             cout << "Introduce el dia: "; medio >> f2.dd; medio.ignore();
  20.             cout << "Introduce el mes: "; medio >> f2.mm; medio.ignore();
  21.             cout << "Introduce el anyo: "; medio >> f2.aa; medio.ignore();
  22.             f2.valido=f2.comprobar();
  23.         }while (f2.valido==false);
  24.         return(medio);
  25.     }
  26.  
  27.     //mostramos al usuario los datos de fecha
  28.     friend ostream& operator << (ostream &medio, fecha f2){
  29.         medio << f2.dd << "/" << f2.mm << "/" << f2.aa << endl;
  30.         return(medio);
  31.     }
  32.  
  33.  
  34.     //comprobamos si la fecha es correcta
  35.     bool comprobar (){
  36.         valido=true;
  37.         if (dd<1 || dd>31) valido=false;
  38.         if (mm<1 || mm>12) valido=false;
  39.         if (aa<1950 || aa>2011) valido=false;
  40.  
  41.         return (valido);
  42.     }
  43.  
  44. };
  45.  
  46. class direccion{
  47.  
  48. private:
  49.     string calle, localidad;
  50.     int numero;
  51. public:
  52.  
  53.     //solicitamos al usuario los datos de direccion
  54.     friend istream& operator >> (istream &medio, direccion &d2){
  55.         cout << "Introduce la calle: ";getline (medio,d2.calle);
  56.         cout << "Introuce el numero: "; medio >> d2.numero; medio.ignore();
  57.         cout << "Introduce la localidad: "; getline (medio,d2.localidad);
  58.         return(medio);
  59.     }
  60.  
  61.         //mostramos al usuario los datos de direccion
  62.     friend ostream& operator << (ostream &medio, direccion d2){
  63.         cout << "Calle: "; medio << d2.calle << endl;
  64.         cout << "Numero: "; medio << d2.numero << endl;
  65.         cout << "Localidad: "; medio << d2.localidad << endl;
  66.         return(medio);
  67.     }
  68.  
  69. };
  70.  
  71. class contacto{
  72.     friend class agenda;
  73.     friend class menu;
  74. private:
  75.     fecha f1;
  76.     direccion d1;
  77.     string nombre, apellidos;
  78.  
  79. public:
  80.  
  81.     //solicitamos los datos del contacto
  82.     friend istream& operator >> (istream &medio, contacto &c1){
  83.         system("cls");
  84.         cout <<"Introduce el nombre: "; getline (medio,c1.nombre);
  85.         cout << "Introduce los apellidos: "; getline (medio,c1.apellidos);
  86.         medio >> c1.f1;
  87.         medio >> c1.d1;
  88.         return(medio);
  89.     }
  90.  
  91.     //mostramos los datos del contacto
  92.     friend ostream& operator << (ostream &medio, contacto c1){
  93.         cout << "Nombre: "; medio << c1.nombre<< endl;
  94.         cout << "Apellidos: "; medio << c1.apellidos<< endl;
  95.         medio << c1.f1;
  96.         medio << c1.d1;
  97.         cout << endl;
  98.  
  99.     return(medio);
  100.  }
  101. };
  102.  
  103. class agenda{
  104. private:
  105.     string buscarnombre;
  106.     contacto *lista;
  107.     bool centinela;
  108.     int n;
  109. public:
  110.  
  111.     //constructor de agenda
  112.     agenda (){
  113.         getch();
  114.         system ("cls");
  115.         cout << "constructor agenda" << endl;
  116.         getch();
  117.         system ("cls");
  118.         if (n<0){
  119.         n=0;
  120.         lista = NULL;
  121.     }
  122.         centinela=true;
  123.         return;
  124.     }
  125.  
  126.     //destructor de agenda
  127.     ~agenda (){
  128.         getch();
  129.         system ("cls");
  130.         cout << "destructor de agenda" << endl;
  131.         getch();
  132.         system ("cls");
  133.         if (lista!=NULL)
  134.         delete []lista;
  135.  
  136.         return;
  137.     }
  138.  
  139.     //constructor de copia de agenda
  140.     agenda (const agenda &copialista){
  141.         getch();
  142.         system ("cls");
  143.         cout << "constructor de copia" << endl;
  144.         getch();
  145.         system ("cls");
  146.         n=copialista.n;
  147.         lista= new contacto[n];
  148.         for (int i=0; i<n; i++){
  149.             lista[i]=copialista.lista[i];
  150.         }
  151.         return;
  152.     }
  153.  
  154.  
  155.  
  156.     //añadir un contacto a la agenda  void operator+= (agenda micontacto1)
  157.     void operator++(int){
  158.         // creamos un objeto vector auxiliar de la clase contacto y le asignamos un tamaño mayor que el actual
  159.         // de la lista de contactos
  160.  
  161.         contacto *aux=new contacto [n+1];
  162.  
  163.         //copiamos el contenido de la lista de contactos en el vector auxiliar
  164.         for (int i=0;i<n;i++){
  165.             aux[i]=lista[i];
  166.         }
  167.         // borramos el vector de la lista de contactos
  168.         delete []lista;
  169.         //igualamos ambos vectores
  170.         lista=aux;
  171.         // metemos el nuevo contacto en eñ vector de la lista de contactos
  172.         cout << "operador de carga" << endl;
  173.         getch();
  174.  
  175.         cin >> lista[n];
  176.         //incrementamos el numero de la lista de contactos para su proxima ejecucion
  177.         n++;
  178.  
  179.         return;
  180.     }
  181.  
  182.  
  183.  
  184.     //mostrar todos los contactos de la agenda
  185.     friend ostream& operator << (ostream &medio, agenda ag1){
  186.  
  187.         if (ag1.n==0){
  188.             cout << "La lista de contactos esta vacia" << endl;
  189.         }else{
  190.  
  191.         for (int i=0;i<ag1.n;i++)cout << ag1.lista[i];
  192.         }
  193.         cout << endl << "Presiona una tecla para volver al menu";
  194.         getch();
  195.         return(medio);
  196.     }
  197.  
  198.  
  199.     // buscar un contacto en la agenda
  200.     void buscar (void){
  201.         system ("cls");
  202.         if (lista!=NULL){
  203.             cout << "Introduce el nombre del contacto: ";
  204.             getline (cin,buscarnombre);
  205.             for (int i=0;i<n;i++){
  206.                 if (lista[i].nombre==buscarnombre){
  207.                     cout << endl;
  208.                     cout << lista[i];
  209.                     centinela=false;
  210.                 }
  211.             }
  212.             if (centinela==true){
  213.                 cout << endl << "No existe ningun contacto con ese nombre";
  214.             }
  215.         }
  216.         cout << endl << "Presiona una tecla para volver al menu";
  217.         getch();
  218.         return;
  219.     }
  220. };
  221.  
  222. class menu{
  223.  
  224. private:
  225.     agenda miagenda;
  226.     int eleccion;
  227. public:
  228.     int solicitar (void){
  229.         do{
  230.             system("cls");
  231.             cout << "1- Nuevo contacto" << endl;
  232.             cout << "2- Listar contactos" << endl;
  233.             cout << "3- Buscar contacto" << endl;
  234.             cout << "4- Salir" << endl << endl;
  235.             cout << "Introduce tu eleccion: ";
  236.             cin >> eleccion; cin.ignore();
  237.             system ("cls");
  238.         }while (eleccion<1 || eleccion>4);
  239.         return (eleccion);
  240.     }
  241.  
  242.     void seleccion (void){
  243.  
  244.         do{
  245.             eleccion=solicitar();
  246.             switch(eleccion){
  247.             case 1:
  248.                 miagenda++;
  249.                 break;
  250.             case 2:
  251.                 cout << miagenda;
  252.                 break;
  253.             case 3:
  254.                 miagenda.buscar();
  255.                 break;
  256.             }
  257.         }while (eleccion!=4);
  258.     }
  259. };
  260.  
  261. int main (void){
  262.     menu m1;
  263.     m1.seleccion();
  264.     getch();
  265.     return(0);
  266. }

Última edición por fingeroso; 13/03/2011 a las 16:17