[C con Clase] vectores y clases

Steven Davidson srd4121 en njit.edu
Mie Abr 29 16:08:38 CEST 2009


Hola Nelfi,

nelfi hernandez wrote:
> Un saludo muy cordial a todos.
> 
> Esta es la primera vez que escribo en la lista, estoy iniciándome con

Ante todo bienvenida a la lista y a este mundillo de la programación de C++.

> c++, y me he topado con un problema que no he podido resolver, mi 
> intención es definir una clase por ejemplo habitante, y después crear
> un vector de esa clase con vector<>, para ir introduciendole datos,
> pero no he podido dar con la manera de implementar esto, les pido por
> favor que me ayuden en esto, aqui les dejo parte del codigp que he
> escrito.
> 

Veamos el código fuente.

> #include <iostream>
> #include <vector>
> #include <cstdlib>
> 
> using namespace std;
> 
> // DEFINICION DE LA CLASE
> 
> class habitantes {

Esto puede ser un problema. Defines el nombre de la clase como 
'habitantes', pero luego indicas que se llama 'habitantes_dn'.

> 
>     private:
> 
>         string              nombre;
>         string              apellido;
>         unsigned long       cedula;
>         unsigned short int  ano_nacimiento;
>         unsigned short int  mes_nacimiento;
>         unsigned short int  dia_nacimiento;
>         unsigned short int  edad;
>         string              provincia;
>         string              direccion;
>         string              telefono;
> 
>     public:
> 

Aconsejo definir un constructor.

>         void agregar_habitante();
>         void actualizar_habitante();
>         void ver_habitante();
> 

No recomiendo agregar '_habitante' a los nombres de estas funciones 
miembros. Al fin y al cabo, invocamos estas funciones a partir de un 
objeto, y por tanto no es necesario explicar que forman parte de 
'habitante'. A veces, puede ser contraproducente el ser demasiado 
explicativo.

> }; // Fin de la definicion de la clase habitante_dn
> 
> 
> // DEFINICION DE LAS FUNCIONES MIEMBROS
> 
> 
> // Definicion de la funcion miembro Agregar_habitante
> 
> void habitantes_dn::agregar_habitante(void) {

Esto es incorrecto, ya que el nombre de la clase es 'habitantes' y no 
'habitantes_dn'. O bien cambias el nombre de la clase en su definición o 
bien cambias el nombre del ámbito.

Por cierto, en C++, no solemos indicar 'void' para una lista vacía de 
parámetros.

> 
>     system("clear");
> 

Ten presente que aunque 'system()' sea una función estándar, el comando 
pasado no lo es. En este caso, esto servirá para un intérprete de 
comandos de Unix o cualquiera de sus "sabores".

>     cout <<"\n\nAgrege los datos del habitante por favor..." << endl << 
> endl;
> 
>     cout <<"Nombre                   : ";
>     getline (cin, nombre);
> 
>     cout <<"\n\nApellido                 : ";
>     getline (cin, apellido);
> 
>     cout <<"\n\nCedula                   : ";
>     cin >> cedula;
> 
>     cout <<"\n\nAño de nacimiento        : ";
>     cin >> ano_nacimiento;
> 
>     cout <<"\n\nMes de nacimiento        : ";
>     cin >> mes_nacimiento;
> 
>     cout <<"\n\nDia de nacimiento        : ";
>     cin >> dia_nacimiento;
> 
>     cout <<"\n\nEdad                     : ";
>     cin >> edad;
> 
>     cin.ignore();
> 
>     cout <<"\n\nProvincia de nacimiento  : ";
>     getline(cin, provincia);
> 
>     cout <<"\n\nDireccion                : ";
>     getline(cin, direccion);
> 
>     cout <<"\n\nTelefono                 : ";
>     getline(cin, telefono);
> 
> } // Fin de la definicion de la funcion miembro Agregar_habitante
> 
> 
> // Definicion de la funcion miembro ver_habitante
> 
> void habitantes_dn::ver_habitante() {
> 

Aquí tienes el mismo problema que en la implementación anterior. El 
nombre de la clase es 'habitantes'.

>    // for (unsigned int i(0); i < habitantes.size(); i++) {
> 
>         system("clear");
> 
> 
>         cout <<"\n\n\t\t! Datos del ciudadano !" << endl << endl;
> 
>         cout <<"Nombre                    : " << habitantesnombre << 
> endl << endl;
> 
>         cout <<"Apellido                  : " << apellido << endl << endl;
> 
>         cout <<"Cedula                    : " << cedula << endl << endl;
> 
>         cout <<"Año de nacimiento         : " << ano_nacimiento << endl 
> << endl;
> 
>         cout <<"Mes de nacimiento         : " << mes_nacimiento << endl 
> << endl;
> 
>         cout <<"Dia de nacimiento         : " << dia_nacimiento << endl 
> << endl;
> 
>         cout <<"Edad                      : " << edad << endl << endl;
> 
>         cout <<"Provincia de nacimiento   : " << provincia << endl << endl;
> 
>         cout <<"Direccion                 : " << direccion << endl << endl;
> 
>         cout <<"Telefono                  : " << telefono << endl << endl;
> 
>   //  } // Fin de For
> 
> 
> } // Fin de la defincion de la funcion miembro ver_habitante
> 
> 
> 
> // USO DE LA CLASE
> 
> void usar_clase(void) {
> 
>    char op;
> 
>    vector<habitantes_dn> habitantes;
>    habitantes_dn habitante;
> 

Aquí tienes el mismo problema que antes. El nombre de la clase es 
'habitantes'. Luego instancias el objeto 'habitantes' cuyo nombre choca 
con el nombre de la clase que definiste al principio.

>    do {
> 
>        habitante.agregar_habitante();
> 
>        habitantes.push_back(habitante);
> 
>        cout <<"\n\nDesea continuar agregando habitantes [ S | N ] ";
>        cin >> op;
>        cin.ignore();
> 
>        cout <<"\n\nRegistros del vector =  " << habitantes.size();
> 
>    } while (op == 's' || op == 'S');
> 
>    habitante.ver_habitante();
> 
> 
> }
> 
> 
> // FUNCION PRINCIPAL
> 
> int main(void){
> 
>    usar_clase();
> 
>    return 0;
> 
> } // Fin de la funcion main
> 
> 


Espero que esto te sirva.

Steven





Más información sobre la lista de distribución Cconclase