[C++] Buscar un dato privado en un vector de clase

Iniciado por Rockmore, 5 Marzo 2011, 21:19 PM

0 Miembros y 2 Visitantes están viendo este tema.

Rockmore

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 (cpp) [Seleccionar]
class Contacto
{
private:
    string nombre, apellidos;
    FechaNacimiento fnac1;
    Direccion dir1;
public:
    void Mostrar(void)
    {
        cout<<"Nombre: "<<nombre<<endl;
        cout<<"Apellidos: "<<apellidos<<endl;
        fnac1.Mostrar();
        dir1.Mostrar();
    }
    void Solicitar(void)
    {
        cout<<"Nombre: ";
        getline(cin,nombre);
        cout<<"Apellidos: ";
        getline(cin,apellidos);
        fnac1.Solicitar();
        dir1.Solicitar();
    }
};

class Agenda
{
private:
    int N;
    Contacto lista1[NMAX];
    string buscar;
    bool exito;
public:
    Agenda(void)
    {
        N=-1;
        exito=false;
    }
    void NuevoContacto(void)
    {
        N++;
        lista1[N].Solicitar();
    }
//...
//Codigo entre medias
//...
    void BuscarContacto(void)
    {
        cout<<"Nombre a buscar: ";
        getline(cin,buscar);
        for(int j=0;j<N;j++)
        {
            if(lista1[j].nombre==buscar)//Esta condicion no es correcta
            {
                lista1[j].Mostrar();
                exito=true;//Centinela de contacto encontrado
            }
        }
        if(exito==false)
        {
            cout<<"Contacto no encontrado"<<endl;
        }
    }
};

Edu

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..

Akai

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.

Rockmore

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 (cpp) [Seleccionar]
class Contacto
{
private:
    string nombre, apellidos;
    FechaNacimiento fnac1;
    Direccion dir1;
public:
    string VerNombre(void)
    {
        return(nombre);
    }

    void Mostrar(void)
    {
        cout<<"Nombre: "<<nombre<<endl;
        cout<<"Apellidos: "<<apellidos<<endl;
        fnac1.Mostrar();
        dir1.Mostrar();
        return;
    }
    void Solicitar(void)
    {
        cout<<"Nombre: ";
        getline(cin,nombre);
        cout<<"Apellidos: ";
        getline(cin,apellidos);
        fnac1.Solicitar();
        dir1.Solicitar();
        return;
    }
};

class Agenda
{
private:
    int N;
    Contacto lista1[NMAX];
    string buscar,comparar;
    bool exito;
public:
    Agenda(void)
    {
        N=-1;
        exito=false;
    }
    void NuevoContacto(void)
    {
        N++;
        lista1[N].Solicitar();
        return;
    }
    void ListarContactos(void)
    {
        if(N<0)
        {
            cout<<"No hay contactos guardados"<<endl;
            getche();
        }
        else
        {
            for(int i=0;i<=N;i++)
            {
                cout<<"Contacto n. "<<i+1<<endl;
                lista1[i].Mostrar();
                getche();
            }
        }
        return;
    }
    void BuscarContacto(void)
    {
        cout<<"Nombre a buscar: ";
        getline(cin,buscar);
        for(int j=0;j<N;j++)
        {
            comparar=lista1[j].VerNombre();
            if(buscar==comparar)
            {
                lista1[j].Mostrar();
                exito=true;
            }
        }
        if(exito==false)
        {
            cout<<"Contacto no encontrado"<<endl;
        }
        return;
    }
};

punk_day22

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=) 

Rockmore

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.

punk_day22

//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;
    }

Rockmore

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 (cpp) [Seleccionar]
class Agenda{
private:
    int N;
    Contacto lista1[NMAX];
public:
    //Constructor por defecto
    Agenda(void){
        N=0;
    }
    //Metodo anyadir contacto
    void NuevoContacto(void){       
        lista1[N].Solicitar();
        N++;
        return;
    }
    //Metodo muestra de contactos
    void ListarContactos(void){
        //Condicion de vector Contacto vacio
        if(N<0){
            cout<<"No hay contactos guardados"<<endl;
            getche();
        }
        else{
            for(int i=0;i<=N;i++){
                cout<<"Contacto n. "<<i+1<<endl;
                lista1[i].Mostrar();
                getche();
            }
        }
        return;
    }
    //Metodo busqueda de contactos
    void BuscarContacto(void){
        string buscar,comparar;
        bool exito=false;
        cout<<"Nombre a buscar: ";
        getline(cin,buscar);
        for(int j=0;j<N;j++){
            //Busqueda de comparador
            comparar=lista1[j].VerNombre();
            //Comprobante
            cout<<comparar<<endl;
            //Comparador de nombres
            if(buscar==comparar){
                lista1[j].Mostrar();
                //Centinela de contacto encontrado
                exito=true;
            }
        }
        if(exito==false){
            cout<<"Contacto no encontrado"<<endl;
        }
        return;
    }
};


De todos modos, gracias por las ideas  ;)