Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Rockmore en 5 Marzo 2011, 21:19 pm



Título: [C++] Buscar un dato privado en un vector de clase
Publicado por: Rockmore en 5 Marzo 2011, 21:19 pm
Saludos. Puede que el título no esté muy claro, así que explicaré cuál es el problema que me ha traído:

En una clase Agenda he de crear un método mediante el cual el usuario introduzca un nombre y el programa muestre todos los datos del vector en los que se encuentre ese nombre. El caso es que el nombre se encuentra en otra clase distinta, y no podemos hacer amigos. Busqué información y descubrí que es posible hacerlo con los métodos get y set, pero no sé cómo aplicarlos.

Aquí pongo parte del código:
Código
  1. class Contacto
  2. {
  3. private:
  4.    string nombre, apellidos;
  5.    FechaNacimiento fnac1;
  6.    Direccion dir1;
  7. public:
  8.    void Mostrar(void)
  9.    {
  10.        cout<<"Nombre: "<<nombre<<endl;
  11.        cout<<"Apellidos: "<<apellidos<<endl;
  12.        fnac1.Mostrar();
  13.        dir1.Mostrar();
  14.    }
  15.    void Solicitar(void)
  16.    {
  17.        cout<<"Nombre: ";
  18.        getline(cin,nombre);
  19.        cout<<"Apellidos: ";
  20.        getline(cin,apellidos);
  21.        fnac1.Solicitar();
  22.        dir1.Solicitar();
  23.    }
  24. };
  25.  
  26. class Agenda
  27. {
  28. private:
  29.    int N;
  30.    Contacto lista1[NMAX];
  31.    string buscar;
  32.    bool exito;
  33. public:
  34.    Agenda(void)
  35.    {
  36.        N=-1;
  37.        exito=false;
  38.    }
  39.    void NuevoContacto(void)
  40.    {
  41.        N++;
  42.        lista1[N].Solicitar();
  43.    }
  44. //...
  45. //Codigo entre medias
  46. //...
  47.    void BuscarContacto(void)
  48.    {
  49.        cout<<"Nombre a buscar: ";
  50.        getline(cin,buscar);
  51.        for(int j=0;j<N;j++)
  52.        {
  53.            if(lista1[j].nombre==buscar)//Esta condicion no es correcta
  54.            {
  55.                lista1[j].Mostrar();
  56.                exito=true;//Centinela de contacto encontrado
  57.            }
  58.        }
  59.        if(exito==false)
  60.        {
  61.            cout<<"Contacto no encontrado"<<endl;
  62.        }
  63.    }
  64. };


Título: Re: [C++] Buscar un dato privado en un vector de clase
Publicado por: Edu en 5 Marzo 2011, 21:24 pm
Si eso del get y set sirve para hacerlo mas formal y mantener privado el campo q usas para poner los nombres.
Pero puedes solamente poner publica la variable q quieres tomar de otro lado y podras modificarla igual.

pd: Ah pero tienes q instanciar la clase primero, yo se C# espero q no este metiendo la pata..


Título: Re: [C++] Buscar un dato privado en un vector de clase
Publicado por: Akai en 5 Marzo 2011, 23:07 pm
Si te está permitido, qué tal añadir un método público en "Contacto" que te devuelva el string nombre, por ejemplo. Creo que es la opción más simple después de un método friend.


Título: Re: [C++] Buscar un dato privado en un vector de clase
Publicado por: Rockmore en 6 Marzo 2011, 12:12 pm
Saludos. Gracias por las aportaciones. Por un lado, los atributos deben ser todos privados, así que no puedo hacer ese público. Por otro lado, añadí un método público en "Contacto" que me devolviera el string nombre. Así no tengo errores de compilación ni de ejecución, sin embargo, es posible que no lo haya creado bien, pues cuando voy a buscar un contacto que he añadido, no me encuentra nada. Ni siquiera me salta el centinela, pues me dice "Contacto no encontrado".
Código
  1. class Contacto
  2. {
  3. private:
  4.    string nombre, apellidos;
  5.    FechaNacimiento fnac1;
  6.    Direccion dir1;
  7. public:
  8.    string VerNombre(void)
  9.    {
  10.        return(nombre);
  11.    }
  12.  
  13.    void Mostrar(void)
  14.    {
  15.        cout<<"Nombre: "<<nombre<<endl;
  16.        cout<<"Apellidos: "<<apellidos<<endl;
  17.        fnac1.Mostrar();
  18.        dir1.Mostrar();
  19.        return;
  20.    }
  21.    void Solicitar(void)
  22.    {
  23.        cout<<"Nombre: ";
  24.        getline(cin,nombre);
  25.        cout<<"Apellidos: ";
  26.        getline(cin,apellidos);
  27.        fnac1.Solicitar();
  28.        dir1.Solicitar();
  29.        return;
  30.    }
  31. };
  32.  
  33. class Agenda
  34. {
  35. private:
  36.    int N;
  37.    Contacto lista1[NMAX];
  38.    string buscar,comparar;
  39.    bool exito;
  40. public:
  41.    Agenda(void)
  42.    {
  43.        N=-1;
  44.        exito=false;
  45.    }
  46.    void NuevoContacto(void)
  47.    {
  48.        N++;
  49.        lista1[N].Solicitar();
  50.        return;
  51.    }
  52.    void ListarContactos(void)
  53.    {
  54.        if(N<0)
  55.        {
  56.            cout<<"No hay contactos guardados"<<endl;
  57.            getche();
  58.        }
  59.        else
  60.        {
  61.            for(int i=0;i<=N;i++)
  62.            {
  63.                cout<<"Contacto n. "<<i+1<<endl;
  64.                lista1[i].Mostrar();
  65.                getche();
  66.            }
  67.        }
  68.        return;
  69.    }
  70.    void BuscarContacto(void)
  71.    {
  72.        cout<<"Nombre a buscar: ";
  73.        getline(cin,buscar);
  74.        for(int j=0;j<N;j++)
  75.        {
  76.            comparar=lista1[j].VerNombre();
  77.            if(buscar==comparar)
  78.            {
  79.                lista1[j].Mostrar();
  80.                exito=true;
  81.            }
  82.        }
  83.        if(exito==false)
  84.        {
  85.            cout<<"Contacto no encontrado"<<endl;
  86.        }
  87.        return;
  88.    }
  89. };


Título: Re: [C++] Buscar un dato privado en un vector de clase
Publicado por: punk_day22 en 9 Marzo 2011, 13:01 pm
Hey tio he conseguido hacerlo con memoria estatica  de todas formas me compila y me funciona canviando ciertas cosas de tu codigo, mañana si puedo te pongo el codigo q aun no lo he completado ^^

pd: eres de la universidad de alicante? por q estoi haciendo una practica identica :P, saludos=) 


Título: Re: [C++] Buscar un dato privado en un vector de clase
Publicado por: Rockmore en 10 Marzo 2011, 17:27 pm
Pues sí, soy de la UA, del grupo de tarde de teleco. Me has pillado. Pues espero tu código, que a mí se me ha secado el cerebro.


Título: Re: [C++] Buscar un dato privado en un vector de clase
Publicado por: punk_day22 en 10 Marzo 2011, 17:44 pm
//Basicamente es lo mismo solo que los atributos que tienes como privado no van hay, pasalos a ponerlos en el metodo como te lo pongo ^^ en realidad era una tonteria


void buscar(void){
        string comparar;
        string buscarnombre;
        bool exito;

        cout<<"Nombre a buscar";


        getline(cin,buscarnombre);
        for(int i=0;i<N;i++){
            comparar=contactos.VerNombre();
            if(buscarnombre==comparar){
                contactos.mostrarcontacto();
                exito=true;
            }

        }
        if(exito==false){
            cout << "Contacto no encontrado" << endl;
        }
        return;
    }


Título: Re: [C++] Buscar un dato privado en un vector de clase
Publicado por: Rockmore en 10 Marzo 2011, 18:13 pm
Bueno, ya está resuelto. El error estaba en que inicializaba N en -1, para luego añadirle 1 antes de crear un contacto nuevo. Queda solucionado inicializando N en 0 y añadirle 1 DESPUES de crear el contacto.

Código
  1. class Agenda{
  2. private:
  3.    int N;
  4.    Contacto lista1[NMAX];
  5. public:
  6.    //Constructor por defecto
  7.    Agenda(void){
  8.        N=0;
  9.    }
  10.    //Metodo anyadir contacto
  11.    void NuevoContacto(void){        
  12.        lista1[N].Solicitar();
  13.        N++;
  14.        return;
  15.    }
  16.    //Metodo muestra de contactos
  17.    void ListarContactos(void){
  18.        //Condicion de vector Contacto vacio
  19.        if(N<0){
  20.            cout<<"No hay contactos guardados"<<endl;
  21.            getche();
  22.        }
  23.        else{
  24.            for(int i=0;i<=N;i++){
  25.                cout<<"Contacto n. "<<i+1<<endl;
  26.                lista1[i].Mostrar();
  27.                getche();
  28.            }
  29.        }
  30.        return;
  31.    }
  32.    //Metodo busqueda de contactos
  33.    void BuscarContacto(void){
  34.        string buscar,comparar;
  35.        bool exito=false;
  36.        cout<<"Nombre a buscar: ";
  37.        getline(cin,buscar);
  38.        for(int j=0;j<N;j++){
  39.            //Busqueda de comparador
  40.            comparar=lista1[j].VerNombre();
  41.            //Comprobante
  42.            cout<<comparar<<endl;
  43.            //Comparador de nombres
  44.            if(buscar==comparar){
  45.                lista1[j].Mostrar();
  46.                //Centinela de contacto encontrado
  47.                exito=true;
  48.            }
  49.        }
  50.        if(exito==false){
  51.            cout<<"Contacto no encontrado"<<endl;
  52.        }
  53.        return;
  54.    }
  55. };

De todos modos, gracias por las ideas  ;)