Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: GisiNA en 15 Febrero 2017, 15:42 pm



Título: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: GisiNA en 15 Febrero 2017, 15:42 pm
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


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: ivancea96 en 15 Febrero 2017, 16:26 pm
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++.


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: GisiNA en 15 Febrero 2017, 18:36 pm
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


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: ivancea96 en 15 Febrero 2017, 23:48 pm
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 (https://en.wikipedia.org/wiki/Friend_class)


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: GisiNA en 16 Febrero 2017, 00:01 am
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:



Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: ivancea96 en 16 Febrero 2017, 13:03 pm
Pues lo dicho. Ya tienes los métodos getter públicos. ¿Qué más necesitas?


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: GisiNA en 16 Febrero 2017, 20:55 pm
Mh... Sabes trabajar con vectores de clases?


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: ivancea96 en 16 Febrero 2017, 21:46 pm
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.


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: GisiNA en 17 Febrero 2017, 17:04 pm
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


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: ivancea96 en 17 Febrero 2017, 21:12 pm
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. }


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: GisiNA en 17 Febrero 2017, 22:30 pm
Oh!
Funcionó!

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 fname;
  12.    string sname;
  13.  
  14. public:
  15. ~Patient(){}
  16.  
  17. Patient(){ }
  18.  
  19. void setFistname(string _fname)
  20. { fname = _fname; }
  21.  
  22. void setSecondname(string _sname)
  23. { sname = _sname; }
  24.  
  25. string getSecondname() const { return sname; }
  26. string getFistname() const { return fname; }
  27. };
  28.  
  29. int main()
  30. {
  31. string _sname, _fname;
  32.  
  33. vector<Patient>vielePatient;
  34. Patient a;
  35.  
  36. cout<<"Apellido: ";
  37. cin >> _fname;
  38. a.setFistname(_fname);
  39.  
  40. cout<<"Nombre: ";
  41. cin >> _sname;
  42. a.setSecondname(_sname);
  43.  
  44. vielePatient.push_back(a);
  45.  
  46. for(int i=0; i<=vielePatient.size(); i++)
  47. {
  48. cout << vielePatient[i].getFistname() << " " << vielePatient[i].getSecondname() << endl;
  49. }
  50.  
  51. return 0;
  52. }
  53.  
  54.  
;-)

Ahora me gustaría aprender el cómo hacer lo mismo con el vector en una clase.


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: GisiNA en 17 Febrero 2017, 22:34 pm
Ohh! Funcionó!!  ;-)
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 fname;
  12.    string sname;
  13.  
  14. public:
  15. ~Patient(){}
  16.  
  17. Patient(){ }
  18.  
  19. void setFistname(string _fname)
  20. { fname = _fname; }
  21.  
  22. void setSecondname(string _sname)
  23. { sname = _sname; }
  24.  
  25. string getSecondname() const { return sname; }
  26. string getFistname() const { return fname; }
  27. };
  28.  
  29. int main()
  30. {
  31. string _sname, _fname;
  32.  
  33. vector<Patient>vielePatient;
  34. Patient a;
  35.  
  36. cout<<"Apellido: ";
  37. cin >> _fname;
  38. a.setFistname(_fname);
  39.  
  40. cout<<"Nombre: ";
  41. cin >> _sname;
  42. a.setSecondname(_sname);
  43.  
  44. vielePatient.push_back(a);
  45.  
  46. for(int i=0; i<=vielePatient.size(); i++)
  47. {
  48. cout << vielePatient[i].getFistname() << " " << vielePatient[i].getSecondname() << endl;
  49. }
  50.  
  51. return 0;
  52. }
  53.  


Ahora me gustaría aprender el cómo se hace con el vector dentro de una clase hijo bajo private. :D

Saludos,
Gisi


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: GisiNA en 17 Febrero 2017, 22:39 pm
( :huh: He intentado publicar ya por tercera vez y salgo volando...)

Y funcionó tu corrección!!! ;-)

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 fname;
  12.    string sname;
  13.  
  14. public:
  15. ~Patient(){}
  16.  
  17. Patient(){ }
  18.  
  19. void setFistname(string _fname)
  20. { fname = _fname; }
  21.  
  22. void setSecondname(string _sname)
  23. { sname = _sname; }
  24.  
  25. string getSecondname() const { return sname; }
  26. string getFistname() const { return fname; }
  27. };
  28.  
  29. int main()
  30. {
  31. string _sname, _fname;
  32.  
  33. vector<Patient>vielePatient;
  34. Patient a;
  35.  
  36. cout<<"Apellido: ";
  37. cin >> _fname;
  38. a.setFistname(_fname);
  39.  
  40. cout<<"Nombre: ";
  41. cin >> _sname;
  42. a.setSecondname(_sname);
  43.  
  44. vielePatient.push_back(a);
  45.  
  46. for(int i=0; i<=vielePatient.size(); i++)
  47. {
  48. cout << vielePatient[i].getFistname() << " " << vielePatient[i].getSecondname() << endl;
  49. }
  50.  
  51. return 0;
  52. }
  53.  
  54.  

Ahora me gustaría aprender hacer lo anterior pero con el vector en una clase hija bajo private.  :D


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: ivancea96 en 18 Febrero 2017, 01:30 am
Todo se reduce a lo mismo. Si es privado, o es porque accedes a él mediante un getter, o es porque es un campo que solo debe conocer la clase. Si tiene el getter, es lo mismo trabajar con él que trabajar con el vector en el main.

De todos modos, no entiendo por qué "clase hija con vector private". Campo privado, clase hija, vector, son 3 conceptos diferentes, y si los manejas los 3, lo puedes combinar como quieras.


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: GisiNA en 19 Febrero 2017, 22:02 pm
Hola!, mira precisamente porque quiero entender a trabajar con esos tres conceptos, pienso que realizar un ejercicio de ese tipo, podría ayudarme.

Este es el ejercicio final que me gustaría poder resolver y así entender la lógica de los tres conceptos que señalas:

Código
  1.  
  2.  
  3. #include <iostream>
  4. #include <iomanip>
  5. #include <cstdlib>
  6. #include <stdio.h>
  7. #include <vector>
  8.  
  9. using namespace std;
  10.  
  11. class Patient
  12. {
  13. private:
  14.    string fname;
  15.    string sname;
  16.  
  17. public:
  18. ~Patient(){}
  19.  
  20. Patient(){ }
  21.  
  22. void setFistname(string _fname)
  23. { fname = _fname; }
  24.  
  25. void setSecondname(string _sname)
  26. { sname = _sname; }
  27.  
  28. string getSecondname() const { return sname; }
  29. string getFistname() const { return fname; }
  30. };
  31.  
  32. class PatientDatenbank : protected Patient
  33. {
  34.   protected:
  35. //vector tipo clase Patient.
  36.   vector<Patient> vielePatient;
  37.   public:
  38.   PatientDatenbank(){}
  39.   //Copia del vector clase Patient
  40.   vector<Patient> GetCopyOfVector()
  41.   { return vielePatient; }
  42.  
  43. // Escribir en la copia del vector
  44. void patInsert(vector<Patient>& vielePatient)
  45.    {    
  46.         vielePatient.push_back(datenbank);
  47.         cout << endl;
  48.    }
  49.  
  50. // Imprimir el vector en pantalla
  51.    void printVectorPatientDatenbank(const vector<Patient>& vielePatient)
  52.    {
  53.        int i;
  54.        int size = vielePatient.size();
  55.  
  56.        for(i=0; i<size; i++)
  57.        {
  58. cout << vielePatient[i].getFistname() << " " << vielePatient[i].getSecondname() << endl;
  59.        }
  60.    }
  61. };
  62.  
  63. int main()
  64. {
  65. string _sname, _fname;
  66. // Patient patient01;
  67.   PatientDatenbank datenbank;
  68.  
  69. cout<<"Apellido: ";
  70. cin >> _fname;
  71. // patient01.setFistname(_fname);
  72. datenbank.setFistname(_fname);
  73.  
  74. cout<<"Nombre: ";
  75. cin >> _sname;
  76. // patient01.setFistname(_sname);
  77. datenbank.setSecondname(_sname);
  78.  
  79.    return 0;
  80. }
  81.  
  82.  

Mi problema radica seguramente en la forma que estoy tratando de acceder al vector. De una parte, pienso que la copia que crea de él está mal. La otra parte que creo errada es la forma en que intento traspasar desde main la información de mi objeto a la clase "PatientDatenbank" que es la que tiene el vector.

El error que recibo es: datenbank no ha sido declarado.

Saludo,
Gisi


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: ivancea96 en 19 Febrero 2017, 22:33 pm
El error lo dice todo.
Código
  1. void patInsert(vector<Patient>& vielePatient)
  2. {    
  3.     vielePatient.push_back(datenbank);
  4.     cout << endl;
  5. }

datenbank no existe. Querrás decir vielePatient. (En cualquier caso, cuidado con llamar a los parámetros igual que a los miembros de la clase)


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: GisiNA en 20 Febrero 2017, 12:06 pm
Hola!
Ya de a poco voy entendiendo mejor los conceptos. Como indicas hice el cambio de los nombres de los parametros.
Ahora bien, database es mi objeto que pretendo almacenar en el vector. maniPatien es el nombe del vector. Por lo que tengo entendido es que la sintaxis de un un push_back es:

NombreVector.push_back(ObjetoAAgregarEnVector);

Yo quiero trapasar mi objeto creado en main database al vector.

Código
  1. void patInsert(vector<Patient>& database)
  2.    {
  3.         //NombreVector.push_back(ObjetoAAgregarEnVector);
  4.         manyPatient.push_back(database);
  5.         cout << endl;
  6.    }
  7.  

El objeto database lo tengo creado con la siguiente declaración:

Código
  1.        // Las variables
  2. string _sname, _fname;
  3.        // Creación objeto database de la clase PatientDatabase
  4.        PatientDatabase database;
  5.  
  6.        // Se llenan las variables
  7. cout<<"Apellido: ";
  8. cin >> _fname;
  9.  
  10. cout<<"Nombre: ";
  11. cin >> _sname;
  12.  
  13.       // Se  traspasa la información de las variables por setter.
  14. database.setName(_fname, _sname);
  15.  
  16.  

Quizás, lo que me intentas señalar es que el vector no debería estar colocado en una clase que hereda sino en la misma clase a la que pertenece. Y que por eso el compilador no reconoce al objeto database creado en main.

Es ese error lógico mío que intentas hacerme entender?

Saludos y muchas gracias.

Dejo acá el código completo:

Código
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cstdlib>
  4. #include <stdio.h>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. class Patient
  10. {
  11. protected:
  12.    string fname;
  13.    string sname;
  14.  
  15. public:
  16. ~Patient(){}
  17.  
  18. Patient(){ }
  19.  
  20. void setName(string _fname, string _sname)
  21. { fname = _fname;
  22.  sname = _sname;}
  23.  
  24. /*void setFirstname(string _fname)
  25. { fname = _fname; }
  26.  
  27. void setSecondname(string _sname)
  28. { sname = _sname; }*/
  29.  
  30. string getSecondname() const { return sname; }
  31. string getFirstname() const { return fname; }
  32. };
  33.  
  34. class PatientDatabase : public Patient
  35. {
  36.   private:
  37. //vector tipo clase Patient.
  38.   //vector<Patient> manyPatient;
  39.   public:
  40.   PatientDatabase(){}
  41.   vector<Patient> manyPatient;
  42.   //Copia del vector clase Patient
  43.   /*vector<Patient> GetCopyOfVector()
  44.    { return manyPatient; }*/
  45.  
  46. // Escribir en la copia del vector
  47. void patInsert(vector<Patient>& manyPatientFull)
  48.    {
  49.         manyPatientFull.push_back(database);
  50.         cout << endl;
  51.    }
  52.  
  53. // Imprimir el vector en pantalla
  54.    void printVectorPatientDatabase(const vector<Patient>& manyPatientShow)
  55.    {
  56.        int i;
  57.        int size = manyPatientShow.size();
  58.  
  59.        for(i=0; i<size; i++)
  60.        {
  61. cout << manyPatientShow[i].getFirstname() << " " << manyPatientShow[i].getSecondname() << endl;
  62.        }
  63.    }
  64. };
  65.  
  66. int main()
  67. {
  68. string _sname, _fname;
  69.  
  70.        PatientDatabase database;
  71.  
  72. cout<<"Apellido: ";
  73. cin >> _fname;
  74.  
  75.  
  76. cout<<"Nombre: ";
  77. cin >> _sname;
  78.  
  79.  
  80. database.setName(_fname, _sname);
  81.  
  82.    return 0;      
  83. }    
  84.  
  85.  

Y acá el error:

Código
  1. In member function ‘void PatientDatabase::patInsert(std::vector<Patient>&):
  2. prog.cpp:48:10: error: ‘manyPatient’ was not declared in this scope
  3.          manyPatient.push_back(database);
  4.  
  5.  


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: ivancea96 en 20 Febrero 2017, 16:20 pm
No existe porque lo has comentado:
Código
  1. //vector<Patient> manyPatient;

Y push_back es, como dices, para añadir 1 elemento. No puedes añadir un vector a un vector con push_back. Tendrás que usar insert (http://www.cplusplus.com/reference/vector/vector/insert/ (http://www.cplusplus.com/reference/vector/vector/insert/))
Por ejemplo, para insertarlo al prin
Código
  1. manyPatient.insert(manyPatient.end(), database.begin(), database.end());


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: GisiNA en 20 Febrero 2017, 16:39 pm
(No, si el error salta con esa parte no comentada. Eliminé el comentario. Lo había colocado, para probar lo que ocurre si dejo el vector en public.)

Ahora bien, efectivamente pretendo no agregar un vector al vector sino un único objeto, a saber el objeto database creado en main.

Porqué cuando tuve el vector en main (algo más arriba está el ejercicio) pude insertar el objeto con push_back y ahora que el vector se encuentra en una clase ya no? :-(


Voy a probar la opción insert.


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: ivancea96 en 20 Febrero 2017, 19:24 pm
Me estás diciendo que teiens problemas pero no me estás enseñando el código con esos problemas.

Si tienes un problema, enseña el código que da ese problema, y los errores que genera.


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: GisiNA en 21 Febrero 2017, 09:54 am
Me estás diciendo que teiens problemas pero no me estás enseñando el código con esos problemas.

Si tienes un problema, enseña el código que da ese problema, y los errores que genera.


Efectivamente he colocado el código con problemas. Y el error correspondiente que arroja también.
Ambos en el mensaje previo al anterior.
Por lo demás, di respuesta a tu comentario que dice que el vector se encuentra comentado y que sobre esa base es que el compilador no puede hallar al objeto database. Mi correspondiente respuesta fue que he ubicado el vector bajo public (comparar las líneas 41 y 38).


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: ivancea96 en 21 Febrero 2017, 15:37 pm
Esque en ese código, el error tampoco es coherente al código:

Código
  1. void patInsert(vector<Patient>& manyPatientFull)
  2. {
  3.     manyPatientFull.push_back(database);
  4.     cout << endl;
  5. }

Código:
In member function ‘void PatientDatabase::patInsert(std::vector<Patient>&)’:
prog.cpp:48:10: error: ‘manyPatient’ was not declared in this scope
          manyPatient.push_back(database);

En uno pone manyPatientFull y en otro manyPatient.

Necesito datos reales para ver tu problema.


Título: Re: C++ OOP vectores de clases - como crear un vector de una clase
Publicado por: GisiNA en 21 Febrero 2017, 17:12 pm
Hola! Mira, resulta que he hallado, tras mucho experimentar, la solución buscada. La esencia del problema, al menos de acuerdo a mi solución, era colocar al vector dentro de una función. De ese modo es posible trabajar con él y al mismo tiempo, heredar de la clase padre.

Acá dejo el código. De todos modos, no lo hubiera logrado sin tus correcciones!  ;-)
Muchas gracias!

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 fname;
  12. string sname;
  13.  
  14. void privateFunción()
  15. {
  16. //string _sname, _fname; // Falls man durch Tastatureingabe Vektor füllen
  17. // will.
  18. vector<Patient>vielePatient;
  19. vectorfuellen(vielePatient);
  20. printVector(vielePatient);
  21. }
  22.  
  23. public:
  24. ~Patient(){}
  25.  
  26. Patient(){ }
  27.  
  28. // Zum aufrufen der privaten Función
  29. void publicFunción()
  30. { privateFunción(); };
  31.  
  32. void setFistname(string _fname)
  33. { fname = _fname; }
  34.  
  35. void setSecondname(string _sname)
  36. { sname = _sname; }
  37.  
  38. void setName(string _fname, string _sname)
  39. { fname = _fname;
  40. sname = _sname;}
  41.  
  42. string getSecondname() const { return sname; }
  43. string getFistname() const { return fname; }
  44.  
  45.  
  46.  
  47. // Función para manipular al vector
  48. // Función 1: llenar el vector
  49. void vectorfuellen(vector<Patient>& f_vielePatient)
  50. {
  51. Patient patient01;
  52. Patient patient02;
  53. Patient patient03;
  54.  
  55. patient01.setName("me", "mo");
  56. patient02.setName("ma", "mu");
  57. patient03.setName("hu", "ju");
  58.  
  59. f_vielePatient.push_back(patient01);
  60. f_vielePatient.push_back(patient02);
  61. f_vielePatient.push_back(patient03);
  62.  
  63. // Falls man durch Tastatureingabe den Vektor füllen will.
  64. // (Muss vieleicht etwas umgestellt werden.)
  65. /*cout<<"Apellido: ";
  66. cin >> _fname;
  67. //patient01.setFistname(_fname);
  68.  
  69. cout<<"Nombre: ";
  70. cin >> _sname;*/
  71. //patient01.setSecondname(_sname);
  72.  
  73. //patient01.setName(_fname, _sname);
  74. }
  75.  
  76. // Función 2: mostrar el vector
  77. void printVector(const vector<Patient>& p_vielePatient){
  78. for(int i=0; i<=p_vielePatient.size(); i++)
  79. { cout << p_vielePatient[i].getFistname() << " " << p_vielePatient[i].getSecondname() << endl; }
  80. }
  81.  
  82.  
  83. };
  84.  
  85. int main()
  86. {
  87.  
  88. Patient patient01;
  89. patient01.publicFunción();
  90.  
  91. return 0;
  92. }  
  93.