elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Java [Guía] Patrones de diseño - Parte 1


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  C++ OOP vectores de clases - como crear un vector de una clase
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: C++ OOP vectores de clases - como crear un vector de una clase  (Leído 2,116 veces)
GisiNA

Desconectado Desconectado

Mensajes: 30


Ver Perfil
C++ OOP vectores de clases - como crear un vector de una clase
« en: 15 Febrero 2017, 15:42 »

Hola a todos,

hay entre UD. quién pueda ayudarme a resolver el siguiente problema?

Ha buscado en innumerables foros, pero, al parecer resulta ser un tema poco tratado.

El siguiente programa consta de dos clases. Una clase base Person que aloja fname y sname de forma protected. La segunda clase Patient quiere tomar esos valores y alojarlos en un vector (y agrega además el valor edad. Para simplificar el tema, he dejado fuera age.)

La función main() crea un objeto Patient.

Sin embargo, no he logrado capt;ar e imprimir en pantalla esa creación.

Alguien puede ayudarme a corregir el código de modo tal que pueda imprimir en pantalla los resultados?

Acá el código:

Código:

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <stdio.h>
#include <vector>

using namespace std;

class Person
{
protected:
string fname;
string sname;
public:
//   Person(){fname = ' '; sname = ' ';}
~Person(){}

Patient(string names, string namef)
{ sname = names;
fname = namef; }


void setNachname(string names)
    { sname = names; }
    void setVorname(string namef)
    { fname = namef; }

string getVorname() const { return fname; }
string getNachname() const { return sname; }

};

class Patient : protected Person
{
protected:
vector<Person> pDB;
//int age;
public:
Patient(){}
~Patient(){}

vector<Person> GetCopyOfVector()
{ return pDB; }


// Agrega el/los objetos creados al vector de la clase Person.
// Toma el vector por referencia para evitar duplicados.
void patInsert(vector<Person>& pDB)
{
pDB.push_back(pDB);
cout << endl;
}

// Imprime el resultado. Capta al vector de forma const
// para evitar modificaciones del vector.
void printVectorPatient(const vector<Person>& pDB)
{
    int i;
    int size = pDB.size();

    for(i=0; i<size; i++)
    {
cout << "Name Patient: " << pDB[i] << endl;
    }
}
};

int main()
{
// Crea un nuevo objeto.
Patient PatDB("ma", "mo");
PatDB.patInsert(PatDB);
PatDB.printVectorPatient(PatDB);

return 0;
}


Muy agradecida  :D,
Gisi


« Última modificación: 15 Febrero 2017, 23:54 por GisiNA » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.291


ASMático


Ver Perfil WWW
Re: C++ OOP vectores de clases - como crear un vector de una clase
« Respuesta #1 en: 15 Febrero 2017, 16:26 »

protected es un nivel de protección igual que private con el añadido de que las clases que heredan pueden verlo también.

Patient no hereda, por tanto, que sea protected o private viene siendo lo mismo.

Si quieres obtener el valor, tendrás que hacer métodos getter que retornen el valor o poner los campos como public.

La pregunta es, ¿por qué necesitas que sean protected esos campos? Si nunca heredas de la clase, es como una clase sin campos visibles.


Y luego, no puedes poner esto:
Código
  1. cout << "Name Patient: " << pDB[i] << endl;
No puedes sacar así por pantalla una "Person". hay formas de lograr que se haga así, pero es algo un poco más "avanzado". En ese caso, deberías usar pDB[ i ].fname, por ejemplo (suponiendo que haces el campo público). Sinó, pDB[ i ].getFName() si usas un getter.


Y como detalle, en vez de stdio.h, utiliza cstdio. (Igual que utilizas cstdlib en vez de stdlib.h). Son las librerías de C++.


En línea

GisiNA

Desconectado Desconectado

Mensajes: 30


Ver Perfil
Re: C++ OOP vectores de clases - como crear un vector de una clase
« Respuesta #2 en: 15 Febrero 2017, 18:36 »

Hola, gracias por la respuesta. Sin embargo, lo que me señalas fue un error de omisión, al traspasar a gran velocidad esta parte desde un código más completo. Seguramente habrá otras omisiones... espero, que no. He corregido el código.

La clase Patient pretende efectivamente heredar de la clase base Person, por lo que es, como señalas, correcto que las variables en la clase base, se encuentren en protected. El tema es, cómo tomo los datos en protected para alojarlos en el vector de clase, de la clase que hereda.

Saludos y muchas gracias!
Gisi
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.291


ASMático


Ver Perfil WWW
Re: C++ OOP vectores de clases - como crear un vector de una clase
« Respuesta #3 en: 15 Febrero 2017, 23:48 »

Ahí veo que has hecho ya los getters. ¿No te sirven?


La última opción (que no te recomiendo en absoluto aquí, no debería ser necesaria), es utilizar friend. Con friend haces que una clase tenga acceso a todo lo privado y protected de otra. https://en.wikipedia.org/wiki/Friend_class
En línea

GisiNA

Desconectado Desconectado

Mensajes: 30


Ver Perfil
Re: C++ OOP vectores de clases - como crear un vector de una clase
« Respuesta #4 en: 16 Febrero 2017, 00:01 »

Hola! Muchas gracias!

Sin embargo, no es lo que necesito. Este código debe tener solución sin friends.

El tema de fondo es como captar los datos de la clase base en un vector-de-clase en la clase que hereda.  :huh:

En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.291


ASMático


Ver Perfil WWW
Re: C++ OOP vectores de clases - como crear un vector de una clase
« Respuesta #5 en: 16 Febrero 2017, 13:03 »

Pues lo dicho. Ya tienes los métodos getter públicos. ¿Qué más necesitas?
En línea

GisiNA

Desconectado Desconectado

Mensajes: 30


Ver Perfil
Re: C++ OOP vectores de clases - como crear un vector de una clase
« Respuesta #6 en: 16 Febrero 2017, 20:55 »

Mh... Sabes trabajar con vectores de clases?
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.291


ASMático


Ver Perfil WWW
Re: C++ OOP vectores de clases - como crear un vector de una clase
« Respuesta #7 en: 16 Febrero 2017, 21:46 »

Sí.

Como te digo, si sigues con problemas, explica exactamente qué problema tienes. Dime exactamente en qué líneas tienes el problema o exactamente que no logras hacer.

Actualmente, tal como lo tienes, la herencia y el vector no tienen nada que ver entre sí.

Sino, explica qué es lo que quieres conseguir con esas clases; qué representan esas clases y por que una hereda y tiene un vector.
En línea

GisiNA

Desconectado Desconectado

Mensajes: 30


Ver Perfil
Re: C++ OOP vectores de clases - como crear un vector de una clase
« Respuesta #8 en: 17 Febrero 2017, 17:04 »

Hola! Que bueno que sepas trabajar con vectores de clase!

Yo no tengo mucha idea como trabajar con ellos.

Mi consulta es más bien un experimento propio en que intento utilizar el vector. Acá te dejo mis primeras andanzas. El siguiente código es el único que he logrado hacer funcionar con un vector de clases.

Código
  1.  
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. class Patient
  9. {
  10.  
  11. public:
  12.    string sname;
  13.    string fname;
  14.  
  15. };
  16.  
  17. int main()
  18. {
  19.    //Vektor de objetos, crear
  20.    vector<Patient>vielePatient;
  21.    //Objekt de clase, crear
  22.   Patient a;
  23.  
  24.  
  25.    cout<<"Apellido: ";
  26.    cin>>a.sname;
  27.      cin.clear();
  28.    cout<<"Nombre: ";
  29. cin>>a.fname;
  30.      cin.clear();
  31.  
  32.    vielePatient.push_back(a);
  33.  
  34.  
  35. for(int i=0; i<=vielePatient.size(); i++)
  36. { cout << vielePatient[i].fname << " " << vielePatient[i].sname << endl;
  37.   }
  38.  
  39.    return 0;
  40. }
  41.  
  42.  

El siguiente paso, que quiero aprender es cómo acceder a las variables cuando ellas están en private:

Código
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. //Klasse einrichten
  8. class Patient
  9. {
  10. private:
  11.    string sname;
  12.    string fname;
  13.  
  14. public:
  15.      // Patient(){fname = ' '; sname = ' ';}
  16.      ~Patient(){}
  17.  
  18.      Patient(string _sname, string _fname)
  19.      {     sname = _sname;
  20.         fname = _fname;
  21.   }
  22.  
  23.      void setNachname(string _sname)
  24.      {    sname = _sname; }
  25.  
  26.      void setVorname(string _fname)
  27.      {    fname = _fname; }
  28.  
  29.      string getVorname() const { return fname; }
  30.      string getNachname() const { return sname; }
  31. };
  32.  
  33. int main()
  34. {
  35.  
  36.    vector<Patient>vielePatient;
  37.  
  38. Patient a;
  39.  
  40.    cout<<"Apellido: ";
  41.    cin>>a.sname;
  42.      cin.clear();
  43.    cout<<"Nombre: ";
  44. cin>>a.fname;
  45.      cin.clear();
  46.  
  47.    vielePatient.push_back(a);
  48.  
  49.  
  50. for(int i=0; i<=vielePatient.size(); i++)
  51. { cout << vielePatient[i].fname << " " << vielePatient[i].sname << endl;
  52.   }
  53.  
  54.    return 0;
  55. }
  56.  

Ahora bien, si desde la funión main se puede acceder a un vector de clase, también debe ser posible hacerlo si el vector está alojado en otra clase que hereda la información de otra.

¿Porqué quiero lograr eso?
Porque sería interesante poder captar la información en un vector que, al estar un private no puede ser sobreescrito, lo que mantiene los datos seguros, y permite, digamos, una sencilla, dinámica, eficiente y elegante forma de acceder a los datos.

Mi idea final es crear una clase, podría llamarse PatientBancoDatos cuya única función es recibir los datos de las clases superiores y los imprima en pantalla.

Espero que la idea está algo más clara.

Saludos,
Gisi
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.291


ASMático


Ver Perfil WWW
Re: C++ OOP vectores de clases - como crear un vector de una clase
« Respuesta #9 en: 17 Febrero 2017, 21:12 »

Pues tendrás que usar los métodos, getters y setters:

Código
  1. string t;
  2. cin >> t;
  3. a.setNachname(t);
  4.  
  5. for(int i=0; i<=vielePatient.size(); i++)
  6. {
  7.    cout << vielePatient[i].getVorname() << endl;
  8. }
En línea

Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines