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

[SOLUCIONADO] punteros y array de objetos

Estas en el tema de punteros y array de objetos en el foro de C/C++ en Foros del Web. Hola a todos, vengo a pedir ayuda con este código porque la verdad estoy trabado con este código de c++, resulta que necesito hacer gestionar ...
  #1 (permalink)  
Antiguo 23/09/2019, 22:32
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
punteros y array de objetos

Hola a todos, vengo a pedir ayuda con este código porque la verdad estoy trabado con este código de c++, resulta que necesito hacer gestionar los contactos en un array y buscando en internet debo usar punteros.
El código me compila pero no guarda los registros en el array, pongo el código:

Agenda.h

Código C++:
Ver original
  1. #ifndef AGENDA_H
  2. #define AGENDA_H
  3. #include <string>
  4. #include <array>
  5. class Agenda {
  6. private:
  7.     int indice;
  8.     int tamanio;
  9.     Contacto* contactos;
  10. public:
  11.     Agenda();
  12.     Agenda(int maxCont);
  13.     bool anyadirContacto(Contacto objcontacto);
  14.     Contacto* buscarPorNombre(std::string nombre);
  15.     Contacto* buscarPorTelefono(int telefono);
  16.     bool borrarPorNombre(std::string nombre);
  17.     bool modificarPorNombre(std::string nombre, int nuevoTelefono);
  18.     std::string toString();
  19. };
  20. #endif /* AGENDA_H */

Agenda.cpp

Código C++:
Ver original
  1. #include "Contacto.h"
  2. #include "Agenda.h"
  3. #include <iostream>
  4. #include <string>
  5. using namespace std;
  6.  
  7. Agenda::Agenda(){}
  8.  
  9. Agenda::Agenda(int maxCont){
  10.     this->indice = 0;
  11.     this->tamanio = maxCont;
  12.     this->contactos = new Contacto[maxCont];    
  13. }
  14.  
  15. bool Agenda::anyadirContacto(Contacto objcontacto) {
  16.     if(indice < tamanio){
  17.         contactos[indice] = objcontacto;
  18.         indice++;
  19.         return true;
  20.     } else {
  21.         return false;
  22.     }
  23. }
  24.  
  25. string Agenda::toString(){
  26.     cout << "indice: " << indice << "\n";
  27.     string res ="";
  28.     int cont = 1;
  29.     for (int i = 0 ; i < indice; i++) {
  30.         res += "\n Contacto " + std::to_string(cont) + "\n" + contactos[i].toString();
  31.         cont++;
  32.     }
  33.     return res;
  34. }
  35.  
  36. Contacto* Agenda::buscarPorNombre(string nombre) {
  37.     for (int i = 0 ; i < (sizeof(this->contactos)/sizeof(*this->contactos)); i++) {
  38.         Contacto contacto = this->contactos[i];
  39.         if (&contacto == NULL) {
  40.             string nom = contacto.getNombre();
  41.             if (nom == nombre) {
  42.                 return &contacto;
  43.             }
  44.         }
  45.     }
  46.     return NULL;
  47. }
  48.    
  49. Contacto* Agenda::buscarPorTelefono(int telefono) {
  50.     for (int i = 0 ; i < (sizeof(this->contactos)/sizeof(*this->contactos)); i++) {
  51.         if (&this->contactos[i] != NULL) {
  52.             int tel = this->contactos[i].getTelefono();
  53.             if (tel == telefono) {
  54.                 return &this->contactos[i];
  55.             }
  56.         }
  57.     }
  58.     return NULL;
  59. }
  60.    
  61. bool Agenda::borrarPorNombre(string nombre ) {
  62.     for (int i = 0 ; i < (sizeof(this->contactos)/sizeof(*this->contactos)); i++) {
  63.         if(&this->contactos[i] != NULL) {
  64.             string nom = contactos[i].getNombre();
  65.             if(nom == nombre){
  66.                 &(this->contactos[i]) == NULL;
  67.                 return true;
  68.             }
  69.         }
  70.     }
  71.     return false;
  72. }
  73.  
  74. bool Agenda::modificarPorNombre(string nombre, int nuevoTelefono) {
  75.     for (int i = 0 ; i < (sizeof(this->contactos)/sizeof(*this->contactos)); i++) {
  76.         Contacto contacto = this->contactos[i];
  77.         string nom = contacto.getNombre();
  78.         if (nom == nombre) {
  79.             contacto.setTelefono(nuevoTelefono);
  80.             return true;
  81.         }        
  82.     }
  83.     return false;
  84. }

main.cpp

Código C++:
Ver original
  1. #include <cstdlib>
  2. #include "Contacto.h"
  3. #include "Agenda.h"
  4. #include "Mensajes.h"
  5. using namespace std;
  6. /**
  7.     * Código de: http://users.dsic.upv.es/~mpastorg/prg-teleco/cursosPasados/2013-14/tema7/EjercicioAgenda_solucion.pdf
  8.     *
  9.     * 2. Haz una clase llamada Agenda para manejar una agenda de teléfonos. Los
  10.     * objetos instanciados a partir de esa clase tendrán la siguientes funcionalidades:
  11.        - Construir una agenda a partir de un número máximo de contactos
  12.          posibles (constructor)
  13.        - Añadir un contacto nuevo
  14.        - Listar todos los contactos de la agenda
  15.        - Buscar un contacto por nombre
  16.        - Buscar un contacto a partir de un número de teléfono
  17.        - Borrar un teléfono dado un nombre
  18.        - Modificar un número de telefono dado un nombre
  19.        - Puedes añadir más métodos si lo consideras adecuado.
  20.        - Las entradas de la agenda se modelarán mediante objetos de la clase
  21.          Contacto que habrá que crear.
  22.     * Para cada Contacto de la agenda se almacenará la siguiente información:
  23.        - Nombre
  24.        - Dirección
  25.        - Código Postal
  26.        - Teléfono
  27. */
  28. void addContacto(Agenda xagenda);
  29. void buscarXNombre(Agenda xagenda);
  30. void buscarXTelefono(Agenda xagenda);
  31. void borrarXNombre(Agenda xagenda);
  32. void modificarXNombre(Agenda xagenda);
  33. /*--------------------*/
  34. int main(int argc, char** argv) {
  35.     int opcion = -1;
  36.     Agenda* agenda = NULL;
  37.     while(opcion != 0) {
  38.         opcion = Mensajes::requestInt(
  39.             "* Ingrese opción:"
  40.             + std::string("\n1.Crear una agenda nueva")
  41.             + std::string("\n2.Añadir contacto")
  42.             + std::string("\n3.Listar agenda")
  43.             + std::string("\n4.Buscar un contacto por nombre")
  44.             + std::string("\n5.Buscar un contacto por telefono")
  45.             + std::string("\n6.Borrar un contacto por nombre")
  46.             + std::string("\n7.Modificar un telefono por nombre")
  47.             + std::string("\n0.Salir"));
  48.         switch(opcion) {
  49.             case 1: {
  50.                 int tamanio = Mensajes::requestInt("¿tamaño de la agenda?");
  51.                 agenda = new Agenda(tamanio);
  52.                 break;
  53.             }
  54.             case 2: {
  55.                 addContacto(*agenda);
  56.                 break;
  57.             }
  58.             case 3: {
  59.                 Mensajes::messageInfo("CONTACTOS\n" + agenda->toString());
  60.                 break;
  61.             }
  62.             case 4: {
  63.                 buscarXNombre(*agenda);
  64.                 break;
  65.             }
  66.             case 5: {
  67.                 buscarXTelefono(*agenda);
  68.                 break;
  69.             }
  70.             case 6: {
  71.                 borrarXNombre(*agenda);
  72.                 break;
  73.             }
  74.             case 7: {
  75.                 modificarXNombre(*agenda);
  76.                 break;
  77.             }
  78.             case 0: {
  79.                 Mensajes::messageInfo("Gracias por usar este sistema :)");
  80.                 break;
  81.             }
  82.             default: {
  83.                 Mensajes::messageInfo("ERROR! Opción equivocada");
  84.                 break;
  85.             }
  86.         }
  87.     }
  88.     return 0;
  89. }
  90. void addContacto(Agenda xagenda){
  91.     string nombre = Mensajes::requestString("Ingrese nombre: ");
  92.     string direccion = Mensajes::requestString("Ingrese dirección: ");
  93.     int codpos = Mensajes::requestInt("Ingrese código postal: ");
  94.     int telefono = Mensajes::requestInt("Ingrese telefono: ");
  95.     Contacto *c = new Contacto(nombre, direccion, codpos, telefono);
  96.     xagenda.anyadirContacto(*c);
  97. }
  98. void buscarXNombre(Agenda xagenda){
  99.     string nombre = Mensajes::requestString("Ingrese nombre para la búsqueda: ");
  100.     Contacto *c = xagenda.buscarPorNombre(nombre);
  101.     if(c != NULL){
  102.         Mensajes::messageInfo(c->toString());
  103.     } else {
  104.         Mensajes::messageInfo("El contacto no existe");
  105.     }
  106. }
  107. void buscarXTelefono(Agenda xagenda){
  108.     int telefono = Mensajes::requestInt("Ingrese telefono para la búsqueda: ");
  109.     Contacto *c = xagenda.buscarPorTelefono(telefono);
  110.     if(c != NULL){
  111.         Mensajes::messageInfo(c->toString());
  112.     } else {
  113.         Mensajes::messageInfo("El contacto no existe");
  114.     }
  115. }
  116. void borrarXNombre(Agenda xagenda){
  117.     string nombre = Mensajes::requestString("Ingrese nombre para la búsqueda: ");
  118.     if(xagenda.borrarPorNombre(nombre)){
  119.         Mensajes::messageInfo(nombre + " fue eliminado :(");
  120.     } else {
  121.         Mensajes::messageInfo("El contacto no existe");
  122.     }
  123. }
  124. void modificarXNombre(Agenda xagenda){
  125.     string nombre = Mensajes::requestString("Ingrese nombre para la búsqueda: ");
  126.     int telefono = Mensajes::requestInt("Editar telefono: ");
  127.     xagenda.modificarPorNombre(nombre, telefono);
  128. }

Sinceramente no sé que hacer, espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #2 (permalink)  
Antiguo 23/09/2019, 23:59
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: punteros y array de objetos

El Paso de parametros es por valor.
No vas a lograr modificar la Agenda asi.
Pasala por referencia o usa un puntero para modificarla.
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 01/10/2019, 21:34
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: punteros y array de objetos

Gracias por responder CalgaryCorpus, pude solucionar el código, no te imaginas cuánto sufrí con este código por los punteros, pongo el código solucionado:

Agenda.h:

Código C++:
Ver original
  1. #ifndef AGENDA_H
  2. #define AGENDA_H
  3. #include <string>
  4. #include <array>
  5. class Agenda {
  6. private:
  7.     int indice;
  8.     int tamanio;
  9.     Contacto *contactos;
  10. public:
  11.     Agenda();
  12.     Agenda(int maxCont);
  13.     bool anyadirContacto(Contacto *);
  14.     Contacto* buscarPorNombre(std::string nombre);
  15.     Contacto* buscarPorTelefono(int telefono);
  16.     bool borrarPorNombre(std::string nombre);
  17.     bool modificarPorNombre(std::string nombre, int nuevoTelefono);
  18.     std::string toString();
  19. };
  20. #endif /* AGENDA_H */

Código C++:
Ver original
  1. #include "Contacto.h"
  2. #include "Agenda.h"
  3. #include <iostream>
  4. #include <string>
  5. using namespace std;
  6. Agenda::Agenda(){}
  7.  
  8. Agenda::Agenda(int maxCont){
  9.     this->indice = 0;
  10.     this->tamanio = maxCont;
  11.     this->contactos = new Contacto[maxCont];
  12. }
  13.  
  14. bool Agenda::anyadirContacto(Contacto *objcontacto) {
  15.     if(indice < tamanio){
  16.         contactos[indice] = *objcontacto;
  17.         indice++;
  18.         return true;
  19.     } else {
  20.         return false;
  21.     }
  22. }
  23.  
  24. bool Agenda::borrarPorNombre(string nombre) {
  25.     for (int i = 0 ; i < indice; i++) {
  26.         if(&contactos[i] != NULL) {
  27.             string nom = this->contactos[i].getNombre();
  28.             if(nom == nombre){                
  29.                 delete[] std::addressof(contactos[i]);
  30.                 for(int d = i; d < indice; d++){
  31.                     contactos[i] = contactos[i + 1];                    
  32.                 }
  33.                 indice--;
  34.                 return true;
  35.             }
  36.         }
  37.     }
  38.     return false;
  39. }
  40.  
  41. string Agenda::toString(){
  42.     cout << "indice: " << indice << "\n";
  43.     string res ="";
  44.     int cont = 1;
  45.     for (int i = 0 ; i < indice; i++) {
  46.         res += "\n Contacto " + std::to_string(cont) + "\n" + contactos[i].toString();
  47.         cont++;
  48.     }
  49.     return res;
  50. }
  51.  
  52. Contacto* Agenda::buscarPorNombre(string nombre) {
  53.     //for(Contacto* contacto : contactos){
  54.     for (int i = 0 ; i < tamanio; i++) {
  55.         Contacto* contacto = &contactos[i];
  56.         if (&contacto != NULL) {
  57.             string nom = contacto->getNombre();
  58.             if (nom == nombre) {
  59.                 return contacto;
  60.             }
  61.         }
  62.     }
  63.     return NULL;
  64. }
  65.    
  66. Contacto* Agenda::buscarPorTelefono(int telefono) {
  67.     for (int i = 0 ; i < tamanio; i++) {
  68.         Contacto* contacto = &contactos[i];
  69.         if (&contacto != NULL) {
  70.             int tel = contacto->getTelefono();
  71.             if (tel == telefono) {
  72.                 return contacto;
  73.             }
  74.         }
  75.     }
  76.     return NULL;
  77. }
  78.    
  79. bool Agenda::modificarPorNombre(string nombre, int nuevoTelefono) {
  80.     for (int i = 0 ; i < indice; i++) {
  81.         Contacto* contacto = &contactos[i];
  82.         if (&contacto != NULL) {
  83.             string nom = contacto->getNombre();
  84.             if (nom == nombre) {
  85.                 contacto->setTelefono(nuevoTelefono);
  86.                 return true;
  87.             }
  88.         }        
  89.     }
  90.     return false;
  91. }

main.cpp:

Código C++:
Ver original
  1. #include <cstdlib>
  2. #include "Contacto.h"
  3. #include "Agenda.h"
  4. #include "Mensajes.h"
  5. using namespace std;
  6. /**
  7.     * Código de: http://users.dsic.upv.es/~mpastorg/prg-teleco/cursosPasados/2013-14/tema7/EjercicioAgenda_solucion.pdf
  8.     *
  9.     * 2. Haz una clase llamada Agenda para manejar una agenda de teléfonos. Los
  10.     * objetos instanciados a partir de esa clase tendrán la siguientes funcionalidades:
  11.        - Construir una agenda a partir de un número máximo de contactos
  12.          posibles (constructor)
  13.        - Añadir un contacto nuevo
  14.        - Listar todos los contactos de la agenda
  15.        - Buscar un contacto por nombre
  16.        - Buscar un contacto a partir de un número de teléfono
  17.        - Borrar un teléfono dado un nombre
  18.        - Modificar un número de telefono dado un nombre
  19.        - Puedes añadir más métodos si lo consideras adecuado.
  20.        - Las entradas de la agenda se modelarán mediante objetos de la clase
  21.          Contacto que habrá que crear.
  22.     * Para cada Contacto de la agenda se almacenará la siguiente información:
  23.        - Nombre
  24.        - Dirección
  25.        - Código Postal
  26.        - Teléfono
  27. */
  28. void addContacto(Agenda *);
  29. void buscarXNombre(Agenda *);
  30. void buscarXTelefono(Agenda *);
  31. void borrarXNombre(Agenda *);
  32. void modificarXNombre(Agenda *);
  33. /*--------------------*/
  34. int main(int argc, char** argv) {
  35.     int opcion = -1;
  36.     Agenda *agenda = NULL;
  37.     while(opcion != 0) {
  38.         opcion = Mensajes::requestInt(
  39.             "* Ingrese opción:"
  40.             + std::string("\n1.Crear una agenda nueva")
  41.             + std::string("\n2.Añadir contacto")
  42.             + std::string("\n3.Listar agenda")
  43.             + std::string("\n4.Buscar un contacto por nombre")
  44.             + std::string("\n5.Buscar un contacto por telefono")
  45.             + std::string("\n6.Borrar un contacto por nombre")
  46.             + std::string("\n7.Modificar un telefono por nombre")
  47.             + std::string("\n0.Salir"));
  48.         switch(opcion) {
  49.             case 1: {
  50.                 int tamanio = Mensajes::requestInt("¿tamaño de la agenda?");
  51.                 agenda = new Agenda(tamanio);
  52.                 break;
  53.             }
  54.             case 2: {
  55.                 addContacto(agenda);
  56.                 break;
  57.             }
  58.             case 3: {
  59.                 Mensajes::messageInfo("\nCONTACTOS:\n" + agenda->toString());
  60.                 break;
  61.             }
  62.             case 4: {
  63.                 buscarXNombre(agenda);
  64.                 break;
  65.             }
  66.             case 5: {
  67.                 buscarXTelefono(agenda);
  68.                 break;
  69.             }
  70.             case 6: {
  71.                 borrarXNombre(agenda);
  72.                 break;
  73.             }
  74.             case 7: {
  75.                 modificarXNombre(agenda);
  76.                 break;
  77.             }
  78.             case 0: {
  79.                 Mensajes::messageInfo("\nGracias por usar este sistema :)\n");
  80.                 break;
  81.             }
  82.             default: {
  83.                 Mensajes::messageInfo("ERROR! Opción equivocada");
  84.                 break;
  85.             }
  86.         }
  87.     }
  88.     return 0;
  89. }
  90. void addContacto(Agenda *xagenda){
  91.     string nombre = Mensajes::requestString("Ingrese nombre: ");
  92.     string direccion = Mensajes::requestString("Ingrese dirección: ");
  93.     int codpos = Mensajes::requestInt("Ingrese código postal: ");
  94.     int telefono = Mensajes::requestInt("Ingrese telefono: ");
  95.     Contacto* c = new Contacto(nombre, direccion, codpos, telefono);
  96.     xagenda->anyadirContacto(c);
  97. }
  98. void buscarXNombre(Agenda *xagenda){
  99.     string nombre = Mensajes::requestString("Ingrese nombre para la búsqueda: ");
  100.     Contacto *c = xagenda->buscarPorNombre(nombre);
  101.     if(c != NULL){
  102.         Mensajes::messageInfo("\nCONTACTO:\n" + c->toString());
  103.     } else {
  104.         Mensajes::messageInfo("\n---El contacto no existe---\n");
  105.     }
  106. }
  107. void buscarXTelefono(Agenda *xagenda){
  108.     int telefono = Mensajes::requestInt("Ingrese telefono para la búsqueda: ");
  109.     Contacto *c = xagenda->buscarPorTelefono(telefono);
  110.     if(c != NULL){
  111.         Mensajes::messageInfo("\nCONTACTO:\n" + c->toString());
  112.     } else {
  113.         Mensajes::messageInfo("\n---El contacto no existe---\n");
  114.     }
  115. }
  116. void borrarXNombre(Agenda *xagenda){
  117.     string nombre = Mensajes::requestString("Ingrese nombre para la búsqueda: ");
  118.     if(xagenda->borrarPorNombre(nombre)){
  119.         Mensajes::messageInfo("\n---" +nombre + " fue eliminado :(---\n");
  120.     } else {
  121.         Mensajes::messageInfo("\n---El contacto no existe---\n");
  122.     }
  123. }
  124. void modificarXNombre(Agenda *xagenda){
  125.     string nombre = Mensajes::requestString("Ingrese nombre para la búsqueda: ");
  126.     int telefono = Mensajes::requestInt("Editar telefono: ");
  127.     xagenda->modificarPorNombre(nombre, telefono);
  128. }

Ahora tengo la siguiente pregunta y es: ¿cómo puedo implementar el begin y end para hacer un foreach con el array? intenté con varios sitios en internet y nunca pude salir de este error:

Cita:
error 'begin' was not declared in this scope
error 'end' was not declared in this scope
Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #4 (permalink)  
Antiguo 02/10/2019, 09:40
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: punteros y array de objetos

Googlea como iterar un arreglo en C++ y ...
Cierra los topicos resueltos y crea otro con esta y otra duda puntual.
Ayuda a revivir el foro al hacerlo util para otros tambien.
10 dudas? -> 10 topicos.
__________________
Visita mi perfil en LinkedIn

Última edición por CalgaryCorpus; 02/10/2019 a las 09:53

Etiquetas: objetos, punteros
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 13:25.