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


 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  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 8,392 veces)
GisiNA

Desconectado Desconectado

Mensajes: 30


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

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.


En línea

GisiNA

Desconectado Desconectado

Mensajes: 30


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

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


En línea

GisiNA

Desconectado Desconectado

Mensajes: 30


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

( :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
« Última modificación: 17 Febrero 2017, 22:45 por GisiNA » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.410


ASMático


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

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.
En línea

GisiNA

Desconectado Desconectado

Mensajes: 30


Ver Perfil
Re: C++ OOP vectores de clases - como crear un vector de una clase
« Respuesta #14 en: 19 Febrero 2017, 22:02 »

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
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.410


ASMático


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

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)
En línea

GisiNA

Desconectado Desconectado

Mensajes: 30


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

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.  
« Última modificación: 21 Febrero 2017, 13:24 por GisiNA » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.410


ASMático


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

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/)
Por ejemplo, para insertarlo al prin
Código
  1. manyPatient.insert(manyPatient.end(), database.begin(), database.end());
En línea

GisiNA

Desconectado Desconectado

Mensajes: 30


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

(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.
« Última modificación: 20 Febrero 2017, 16:54 por GisiNA » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.410


ASMático


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

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