[C con Clase] Constructor en estructuras no funciona

Davidson, Steven srd4121 en njit.edu
Sab Oct 6 21:03:44 CEST 2012


Hola Gonzalo,

2012/10/6 Gonzalo Uribe <neogonxy en gmail.com>:
> Buenas, tengo un problema cuando trato de inicializar una estructura, pero
> me sale un error. Leí 5 veces la categoría de estructuras pero no encuentro
> el error.
>
> El error exactamente está en esta parte:
>

Veamos el código fuente.

>>> //Declaramos variables
>>>
>>>     int opcion;
>>>
>>>     char buscador[25];
>>>
>>>     struct Datos{
>>>
>>>            char nombre[25];
>>>
>>>            char telefono[25];
>>>
>>>            Datos();
>>>
>>>            } personas[10];
>>>

No aconsejo definir la estructura dentro de 'main()'. En general,
queremos usar los tipos de datos en todo nuestro programa, por lo que
se definen los tipos globalmente.

>>>
>>>     //Definición constructor
>>>

Esto ya es problemático. No puedes implementar funciones dentro de
otras, al menos que sean funciones lambda, pero como no viene al caso,
no hablaremos de ellas.

Por esta razón, deberías definir la estructura 'Datos' globalmente,
porque las funciones miembro deben ser implementadas globalmente.

>>>     Datos::Datos() {
>>>
>>>         for(int i=0; i<25; i++){
>>>
>>>            nombre[i] = '0';
>>>
>>>            telefono[i] = 'a';
>>>
>>>             }
>>>

Este algoritmo no es del todo correcto, porque intentas crear una
cadena de caracteres. Sin embargo, no has autoterminado la cadena, con
un carácter nulo. Esto sería,

for( int i=0; i<24; i++ )
{
  nombre[i] = '0';
  telefono[i] = 'a';
}

nombre[24] = telefono[24] = 0;

Por otro lado, si sólo quieres inicializar las cadenas, entonces
simplemente asigna el carácter nulo para crear una cadena nula; esto
es,

nombre[0] = telefono[0] = 0;

>>>     }
>
>
>  El código completo (por si se necesita) es este:
>

Veamos el resto del código fuente.

>>>

[CORTE]

>>>     //Inicializamos arrays
>>>
>>>     for(int i=0; i<25; i++){
>>>
>>>             buscador[i] = '0';
>>>
>>>             }
>>>

Nuevamente, creo que es mejor inicializar la cadena a nula; esto sería,

char buscador[25] = "";

Si no, pues entonces, asigna el carácter nulo directamente:

buscador[0] = 0;

>>>
>>>
>>>
>>>     //Pedimos los datos
>>>
>>>     cout<<"Ingrese los datos de 10 personas con su numero de
>>> telefono"<<endl;
>>>
>>>     for (int i=0; i<10; i++){
>>>
>>>         cout<<"Nombre "<<i+1<<":"<<endl;
>>>
>>>         cin>>personas[i].nombre;
>>>
>>>         cout<<"Telefono "<<i+1<<":"<<endl;
>>>
>>>         cin>>personas[i].telefono;
>>>
>>>     }
>>>
>>>
>>>
>>>     //Comienza bucle principal
>>>
>>>     cout<<"Gracias, ahora seleccione una opcion"<<endl;
>>>
>>>     for(int bucle=0; bucle == 0;) {
>>>

El funcionamiento de 'bucle' es para controlar este bucle y por tanto
usas esta variable como un booleano. Por lo tanto, aconsejo definir
esta variable como booleana y así puedes usar uno de dos valores. Por
ejemplo,

bool bSalir = false;
do
{
  ...
  if( 3 == opcion )  bSalir = true;
} while( !bSalir );

>>>              bucle = 0;
>>>
>>>              cout<<endl<<endl;
>>>
>>>              cout<<"1) Buscar por nombre"<<endl;
>>>
>>>              cout<<"2) Buscar por telefono"<<endl;
>>>
>>>              cout<<"3) Salir"<<endl;
>>>
>>>              cin>>opcion;
>>>
>>>              if(opcion == 3) bucle = 1;
>>>
>>>              if(opcion == 1) cout<<"1"<<endl;
>>>
>>>              if(opcion == 2) cout<<"2"<<endl;
>>>

Podrías usar varias sentencias 'if', aunque tiene más sentido si son
'if/else', ya que no se dará el caso de que 'opcion' contenga el valor
1 y después 2 y 3. Sugiero usar un 'switch/case' que suele ser más
elegante y legible.

>


Espero que esto te oriente.

Steven




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