Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con sobrecarga operadores +=

Estas en el tema de Problema con sobrecarga operadores += en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 13/03/2011, 16:11
 
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
  #2 (permalink)  
Antiguo 14/03/2011, 05:38
 
Fecha de Ingreso: febrero-2011
Ubicación: Paraguay
Mensajes: 59
Antigüedad: 13 años, 9 meses
Puntos: 1
Respuesta: Problema con sobrecarga operadores +=

no vi en ninguna parte del programa que hagas la sobrecarga del operador ++. Si pudiste hacer eso no creo que te sea dificil hacer la sobrecarga del operador +=.
  #3 (permalink)  
Antiguo 14/03/2011, 09:50
 
Fecha de Ingreso: marzo-2011
Mensajes: 13
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Problema con sobrecarga operadores +=

Cita:
Iniciado por Gott Ver Mensaje
no vi en ninguna parte del programa que hagas la sobrecarga del operador ++. Si pudiste hacer eso no creo que te sea dificil hacer la sobrecarga del operador +=.
Hice una cutre sobrecarga del operador ++ pero no consigo hacer la +=. No se si necesito crear operador suma y asignacion para poder hacer e +=. Ayuda por favor.
  #4 (permalink)  
Antiguo 14/03/2011, 16:42
Avatar de SDEK  
Fecha de Ingreso: diciembre-2009
Ubicación: MX
Mensajes: 156
Antigüedad: 15 años
Puntos: 8
Respuesta: Problema con sobrecarga operadores +=

¿miagenda += miagenda; ?? ¿ Eso quieres hacer?
__________________
Tecnologías de la Información
Karel Priego
| @karelpriego
  #5 (permalink)  
Antiguo 14/03/2011, 19:14
 
Fecha de Ingreso: marzo-2011
Mensajes: 13
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Problema con sobrecarga operadores +=

Cita:
Iniciado por SDEK Ver Mensaje
¿miagenda += miagenda; ?? ¿ Eso quieres hacer?
nop, quiero hacer miagenda+=micontacto;

Algo he conseguido pero ahora no me guarda en la lista de contactos, empiezo a volverme loco.
Por cierto voy a editar el highlight de arriba para dejarlo igual que este pero no me deja.

Aclaro, la instruccion miagenda+=micontacto esta en la linea 275. Los operadores para la sobrecargar empiezan en la linea 156. Se que tiene algo que ver con el bloque de instrucciones que contienen pero en serio... mi cabeza no da para más. Como veis lo he seguido intentando por mi mismo y algo he conseguido. Si pudierais ayudarme os lo agradeceria muchisimo. No pido que lo completeis (que no estaria mal jeje) pero por favor necesito consejo y ayuda.


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.     friend class agenda;
  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.     friend class agenda;
  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. private:
  74.     fecha f1;
  75.     direccion d1;
  76.     string nombre, apellidos;
  77.  
  78. public:
  79.  
  80.     //solicitamos los datos del contacto
  81.     friend istream& operator >> (istream &medio, contacto &c1){
  82.         system("cls");
  83.         cout <<"Introduce el nombre: "; getline (medio,c1.nombre);
  84.         cout << "Introduce los apellidos: "; getline (medio,c1.apellidos);
  85.         medio >> c1.f1;
  86.         medio >> c1.d1;
  87.         return(medio);
  88.     }
  89.  
  90.     //mostramos los datos del contacto
  91.     friend ostream& operator << (ostream &medio, contacto c1){
  92.         cout << "Nombre: "; medio << c1.nombre<< endl;
  93.         cout << "Apellidos: "; medio << c1.apellidos<< endl;
  94.         medio << c1.f1;
  95.         medio << c1.d1;
  96.         cout << endl;
  97.  
  98.         return(medio);
  99.     }
  100. };
  101.  
  102. class agenda{
  103. private:
  104.     string buscarnombre;
  105.  
  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.         n=0;
  119.         lista = NULL;
  120.         centinela=true;
  121.         return;
  122.     }
  123.     agenda (contacto micontacto){
  124.         lista = new contacto[n+1];
  125.         lista[n]=micontacto;
  126.         return;
  127.     }
  128.  
  129.     //destructor de agenda
  130.     ~agenda (){
  131.         getch();
  132.         system ("cls");
  133.         cout << "destructor de agenda" << endl;
  134.         getch();
  135.         system ("cls");
  136.         if (lista!=NULL)
  137.             delete []lista;
  138.         return;
  139.     }
  140.  
  141.     //constructor de copia de agenda
  142.     agenda (const agenda &copialista){
  143.         getch();
  144.         system ("cls");
  145.         cout << "constructor de copia" << endl;
  146.         getch();
  147.         system ("cls");
  148.         n=copialista.n;
  149.         lista= new contacto[n+1];
  150.         for (int i=0; i<n; i++){
  151.             lista[i]=copialista.lista[i];
  152.         }
  153.         return;
  154.     }  
  155.  
  156.     agenda operator+(agenda ag1){
  157.         agenda resul;
  158.         resul.lista= new contacto [n+1];
  159.         for (int i=0;i<n;i++){
  160.             resul.lista[i]=ag1.lista[i];
  161.         }
  162.         return (resul);
  163.     }
  164.     agenda operator+=(contacto micontacto){
  165.         agenda resul,ag1(*this),ag2(micontacto);
  166.         resul=ag1+ag2;
  167.         return(resul);
  168.     }
  169.  
  170.     agenda operator=(agenda ag1){
  171.         ag1.n=n;
  172.         for (int i=0;i<ag1.n;i++){
  173.             lista[i]=ag1.lista[i];
  174.             n++;
  175.         }
  176.         return (*this);
  177.     }
  178.  
  179.  
  180.  
  181.     //mostrar todos los contactos de la agenda
  182.     friend ostream& operator << (ostream &medio, agenda ag1){
  183.  
  184.         if (ag1.n==0){
  185.             cout << "La lista de contactos esta vacia" << endl;
  186.         }else{
  187.  
  188.             for (int i=0;i<ag1.n;i++)cout << ag1.lista[i];
  189.         }
  190.         cout << endl << "Presiona una tecla para volver al menu";
  191.         getch();
  192.         return(medio);
  193.     }
  194.     void ordenar (void){
  195.         string compara1, compara2,comparanom1, comparanom2;
  196.  
  197.         contacto aux;
  198.         for (int i=0;i<n-1;i++){
  199.  
  200.             for (int j=i+1;j<n;j++){
  201.                 compara1=lista[i].apellidos;
  202.                 compara2=lista[j].apellidos;
  203.  
  204.                 if (compara1>compara2){
  205.                     aux=lista[i];
  206.                     lista[i]=lista[j];
  207.                     lista[j]=aux;
  208.                 }
  209.                 if (compara1==compara2){
  210.                     comparanom1=lista[i].nombre;
  211.                     comparanom2=lista[j].nombre;
  212.                     if (comparanom1>comparanom2){
  213.                         aux=lista[i];
  214.                         lista[i]=lista[j];
  215.                         lista[j]=aux;
  216.                     }
  217.                 }
  218.             }
  219.         }
  220.         return;
  221.     }
  222.  
  223.     // buscar un contacto en la agenda
  224.     void buscar (void){
  225.         system ("cls");
  226.         if (lista!=NULL){
  227.             cout << "Introduce el nombre del contacto: ";
  228.             getline (cin,buscarnombre);
  229.             for (int i=0;i<n;i++){
  230.                 if (lista[i].nombre==buscarnombre){
  231.                     cout << endl;
  232.                     cout << lista[i];
  233.                     centinela=false;
  234.                 }
  235.             }
  236.             if (centinela==true){
  237.                 cout << endl << "No existe ningun contacto con ese nombre";
  238.             }
  239.         }
  240.         cout << endl << "Presiona una tecla para volver al menu";
  241.         getch();
  242.         return;
  243.     }
  244. };
  245.  
  246. class menu{
  247.  
  248. private:
  249.     agenda miagenda;
  250.     contacto micontacto;
  251.     int eleccion;
  252. public:
  253.     int solicitar (void){
  254.         do{
  255.             system("cls");
  256.             cout << "1- Nuevo contacto" << endl;
  257.             cout << "2- Listar contactos" << endl;
  258.             cout << "3- Buscar contacto" << endl;
  259.             cout << "4- Salir" << endl << endl;
  260.             cout << "Introduce tu eleccion: ";
  261.             cin >> eleccion; cin.ignore();
  262.             system ("cls");
  263.         }while (eleccion<1 || eleccion>4);
  264.         return (eleccion);
  265.     }
  266.  
  267.     void seleccion (void){
  268.  
  269.         do{
  270.             eleccion=solicitar();
  271.             miagenda.ordenar();
  272.             switch(eleccion){
  273.             case 1:
  274.                 cin >> micontacto;
  275.                 miagenda+=micontacto;
  276.                 break;
  277.             case 2:
  278.                 cout << miagenda;
  279.                 break;
  280.             case 3:
  281.                 miagenda.buscar();
  282.                 break;
  283.             }
  284.         }while (eleccion!=4);
  285.     }
  286. };
  287.  
  288. int main (void){
  289.     menu m1;
  290.     m1.seleccion();
  291.     getch();
  292.     return(0);
  293. }

Última edición por fingeroso; 14/03/2011 a las 19:20
  #6 (permalink)  
Antiguo 14/03/2011, 20:42
Avatar de SDEK  
Fecha de Ingreso: diciembre-2009
Ubicación: MX
Mensajes: 156
Antigüedad: 15 años
Puntos: 8
Respuesta: Problema con sobrecarga operadores +=

Aquí viene claramente como sobrecargar el operador de asignación en C++:

http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Sobrecarga_de_Operadores

Saludos,
__________________
Tecnologías de la Información
Karel Priego
| @karelpriego
  #7 (permalink)  
Antiguo 14/03/2011, 21:43
 
Fecha de Ingreso: marzo-2011
Mensajes: 13
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Problema con sobrecarga operadores +=

Ya lo habia visto este fin de semana pasado, pero tanto como claramente.... jajajaja. Mañana seguiré intentandolo. La cosa esta bastante cerca de funcionar pero sigo sin verlo claro con la mierda de atributos dinamicos. Por lo menos ahora consigo compilarlo sin errores. Es decir que la sobrecarga de operadores funciona, el problema viene con el bloque de instrucciones de cada sobrecarga de operador.

Nuevamente, gracias por las respuestas.

Última edición por fingeroso; 14/03/2011 a las 21:49
  #8 (permalink)  
Antiguo 14/03/2011, 21:55
Avatar de SDEK  
Fecha de Ingreso: diciembre-2009
Ubicación: MX
Mensajes: 156
Antigüedad: 15 años
Puntos: 8
Respuesta: Problema con sobrecarga operadores +=

Me comprometo a revisar tu código mañana para apoyarte y explicarte. Por ahora no puedo, (trabajo) pero en el transcurso de mañana lo haré .... saludos!
__________________
Tecnologías de la Información
Karel Priego
| @karelpriego
  #9 (permalink)  
Antiguo 15/03/2011, 11:44
 
Fecha de Ingreso: marzo-2011
Mensajes: 13
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Problema con sobrecarga operadores +=

Cita:
Iniciado por SDEK Ver Mensaje
Me comprometo a revisar tu código mañana para apoyarte y explicarte. Por ahora no puedo, (trabajo) pero en el transcurso de mañana lo haré .... saludos!
Mil millones de gracias por mostrar interes en ayudarme. De cualquier forma, parece que ya he conseguido entender más o menos esto de la sobrecarga de operadores. . Ahora solo me queda que me cargue los datos desde un *.txt , guardarlos me los guarda pero cargarlos me trae de cabeza también.

Esperare al viernes, que tengo que presentar la práctica para colgar el codigo (ahora sí 100% funcional), el motivo no es otro que ningun compañero de clase lo copie y se lleve el los mismos meritos que yo.

De manera que INFORMO QUE YA LO HE SOLUCIONADO, gracias a todos y EL VIERNES LO COLGARE TERMINADO
  #10 (permalink)  
Antiguo 15/03/2011, 11:53
Avatar de SDEK  
Fecha de Ingreso: diciembre-2009
Ubicación: MX
Mensajes: 156
Antigüedad: 15 años
Puntos: 8
Respuesta: Problema con sobrecarga operadores +=

Que bueno, esperaremos a ver como lo solucionaste.

Saludos,
__________________
Tecnologías de la Información
Karel Priego
| @karelpriego
  #11 (permalink)  
Antiguo 15/03/2011, 12:12
 
Fecha de Ingreso: marzo-2011
Mensajes: 13
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Problema con sobrecarga operadores +=

Cita:
Iniciado por SDEK Ver Mensaje
Que bueno, esperaremos a ver como lo solucionaste.

Saludos,
pues, la solucion era usar solamente el operador autosuma += pasandole como parametro micontacto y no devolver nada en el return.

Me he pasado el fin de semana comiendome la cabeza para resultar ser algo mucho mas sencillo.

Ahora solo me queda cargar desde el constructor todas las variables que guardo una vez se ejecuta mi destructor.

Repito, el código lo cuelgo el viernes a la noche o sábado por la mañana. Lo colgaría antes pero no quiero arriesgarme a que algun compañero busque en google miagenda+=micontacto esperando tener suerte y se encuentre con todo el trabajo ya hecho.
  #12 (permalink)  
Antiguo 15/03/2011, 13:05
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 19 años, 5 meses
Puntos: 9
Respuesta: Problema con sobrecarga operadores +=

a ver si esto es lo que querias hacer
Código C++:
Ver original
  1. #include "stdafx.h"
  2. #include <vector>
  3. #include <string>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. class CContacto
  9. {
  10.     string _nombre;
  11.  
  12. public:
  13.     void Nombre(const string& nombre)
  14.     {
  15.         _nombre= nombre;
  16.     }
  17.  
  18.     const string &Nombre()
  19.     {
  20.         return _nombre;
  21.     }
  22.  
  23. };
  24.  
  25. class CAgenda
  26. {
  27.     vector<CContacto> _contactos;
  28.  
  29. public:
  30.  
  31.     CAgenda &operator +=(const CContacto& contactos )
  32.     {
  33.         _contactos.push_back(contactos);
  34.         return *this;
  35.     }
  36.  
  37.     CContacto& operator[](int pos)
  38.     {
  39.         return _contactos[pos];
  40.     }
  41. };
  42.  
  43. int _tmain(int argc, _TCHAR* argv[])
  44. {
  45.  
  46.     CContacto contacto;
  47.     CAgenda agenda;
  48.     contacto.Nombre("Mi nombre");
  49.  
  50.     agenda+=contacto;
  51.  
  52.     cout<<"Nombre del contacto"<< agenda[0].Nombre();
  53.  
  54.     return 0;
  55. }
  #13 (permalink)  
Antiguo 15/03/2011, 13:13
 
Fecha de Ingreso: marzo-2011
Mensajes: 13
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Problema con sobrecarga operadores +=

Cita:
Iniciado por dragg04 Ver Mensaje
a ver si esto es lo que querias hacer
Código C++:
Ver original
  1. #include "stdafx.h"
  2. #include <vector>
  3. #include <string>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. class CContacto
  9. {
  10.     string _nombre;
  11.  
  12. public:
  13.     void Nombre(const string& nombre)
  14.     {
  15.         _nombre= nombre;
  16.     }
  17.  
  18.     const string &Nombre()
  19.     {
  20.         return _nombre;
  21.     }
  22.  
  23. };
  24.  
  25. class CAgenda
  26. {
  27.     vector<CContacto> _contactos;
  28.  
  29. public:
  30.  
  31.     CAgenda &operator +=(const CContacto& contactos )
  32.     {
  33.         _contactos.push_back(contactos);
  34.         return *this;
  35.     }
  36.  
  37.     CContacto& operator[](int pos)
  38.     {
  39.         return _contactos[pos];
  40.     }
  41. };
  42.  
  43. int _tmain(int argc, _TCHAR* argv[])
  44. {
  45.  
  46.     CContacto contacto;
  47.     CAgenda agenda;
  48.     contacto.Nombre("Mi nombre");
  49.  
  50.     agenda+=contacto;
  51.  
  52.     cout<<"Nombre del contacto"<< agenda[0].Nombre();
  53.  
  54.     return 0;
  55. }


Hay muchas cosas que todavia no entiendo. Pero ya lo he conseguido solucionar. Ahora tengo otro problema y es a la hora de cargar. De cualquier modo, gracias por tu respuesta.

Código C++:
Ver original
  1. void cargar (void){
  2.         ifstream fichero ("datos.txt");
  3.         if(fichero.good()==true){
  4.             while(fichero.eof()==false){
  5.                 fichero >> n;
  6.                 fichero.ignore();
  7.                 for (int i=0; i<n;i++){
  8.                     fichero >> lista[i].nombre;
  9.                     fichero >> lista[i].apellidos;
  10.                     fichero >> lista[i].f1.dd;
  11.                     fichero >> lista[i].f1.mm;
  12.                     fichero >> lista[i].f1.aa;
  13.                     fichero >> lista[i].d1.calle;
  14.                     fichero >> lista[i].d1.numero;
  15.                     fichero >> lista[i].d1.localidad;
  16.                 }
  17.             }
  18.         }
  19.         fichero.close();
  20.         return;
  21.     }

Como veis tengo que cargar ciertas variables que son de tipo string sin embargo cuando lo cargo de esta forma me da fallos.
  #14 (permalink)  
Antiguo 15/03/2011, 13:27
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 19 años, 5 meses
Puntos: 9
Respuesta: Problema con sobrecarga operadores +=

podrias mostrar como tienes estructurado tu archivo datos.txt, en segunda lista tiene el espacio sufiente para almacenar todos los registos?
  #15 (permalink)  
Antiguo 15/03/2011, 14:20
 
Fecha de Ingreso: marzo-2011
Mensajes: 13
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Problema con sobrecarga operadores +=

Código C++:
Ver original
  1. void guardar (void){
  2.         ofstream fichero ("datos.txt");
  3.         fichero << n << endl;
  4.         for (int i=0;i<n;i++){
  5.             fichero << lista[i].nombre << endl;
  6.             fichero << lista[i].apellidos << endl;
  7.             fichero << lista[i].f1.dd << endl;
  8.             fichero << lista[i].f1.mm << endl;
  9.             fichero << lista[i].f1.aa << endl;
  10.             fichero << lista[i].d1.calle << endl;
  11.             fichero << lista[i].d1.numero << endl;
  12.             fichero << lista[i].d1.localidad << endl;
  13.         }
  14.         fichero.close();
  15.         return;
  16.     }

Así es como guardo la lista de contactos en el txt.
  #16 (permalink)  
Antiguo 17/03/2011, 15:50
 
Fecha de Ingreso: marzo-2011
Mensajes: 13
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Problema con sobrecarga operadores +=

jajajajaja que imbecil que soy pero un gran imbecil. Ahora ya esta todo solucionado y el programa cumple su cometido al 100%. Asi que nada, gracias a todos pero al final me las he apañado para conseguirlo. Mañana cuelgo el codigo.
  #17 (permalink)  
Antiguo 19/03/2011, 14:04
 
Fecha de Ingreso: marzo-2011
Mensajes: 13
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Problema con sobrecarga operadores +=

vale, el problema al guardar los datos en el txt era tan simple como que ejecutaba un salto de linea al agregar el ultimo contacto. Este salto de linea era necesario en todos los contactos excepto en el ultimo. LA solucion era crear un condicional para que ejecute el salto de linea siempre que no sea el ultimo contacto. Despues todo carga y guarda correctamente. La practica completada al 100%.

El codigo he decidido no colgarlo porque parece ser que algun compañero ha usado mi trabajo para hacer el suyo. En cualquier caso, estoy guardando todos los trabajos y cuando termine el curso los subire a esta web para compartirlos con vosotros.

Etiquetas: operadores
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:32.