[C con Clase] Estructuras y punteros

Steven Davidson srd4121 en njit.edu
Mar Feb 24 21:35:54 CET 2009


Hola Ángel,

Angel Adrián Carrillo Comparán wrote:
> Tengo un problema con unos punteros, cuando mandoa  llamar la funcion
> de Leer(Cilindro &RefCil) esta manda a llamar a Leer(Circulo &RefC) 
> pasandole como parametro el puntero Circulo  de la estructura de 
> Cilindro y esta funsion a su ves llama a Leer(Punto &RefP) pasandole
>  como parametro el puntero Punto de la estructura de Circulo.
> 

Quiero aclarar que estos parámetros no son punteros sino referencias. Lo 
que sí es cierto es que en tu diseño, estas referencias contienen punteros.

> El problema es que al leer los valores de punto y regresar a 
> Leer(Circulo &RefC) los valores de punto se mantienen, pero al
> regresar a Leer(Cilindro &RefCil) los valores que tenia la estructura
> de Punto ya no contienen valores, les pongo el programa que estoy
> realizando, de ante mano muchas gracias!!!!
> 

Esto es porque los punteros miembros de estas estructuras apuntan a 
variables locales, las cuales son destruidas nada más terminar su 
ámbito, que en estos casos es al terminar la función.

Veamos el código fuente.

> #include <iostream>                 //Para cout y cin
> #include <conio.h>                 //Para getch()  y clrscr() ó ystem 
> ("cls")
> #include <iomanip>                 //Para setfill() y setw()
> #include <stdio.h>                 //Para gets()
> #include <math.h>                //Para M_PI
> 

Sugiero usar los nombres recientes: <cstdio> y <cmath>.

[CORTE]

> int main (void)
>     {
>         //clrscr();
>         system ("cls");
>         Cilindro Cil;
>         Leer (Cil);
>         cout << Cil.AptC->AptP->coordx << Cil.AptC->AptP->coordy;
>                 
>         cout.setf (ios::fixed);
>         cout.setf (ios::showpoint);
>         cout.precision (2);
>                 
>         Imprimir (Cil);
>         getch();
>         return 0;
>     }                           //fin de main ()
>        
> void Leer (Punto &RefP)
>     {
>         cout << "\tDATOS DEL PUNTO\n"
>              << "\tIngresa la coordenada de X: ";
>         cin  >> RefP.coordx;
>         cout << "\tIngresa la coordenada de Y: ";
>         cin  >> RefP.coordy;
>         cout << endl;
>     }                            //fin de leer ()
>      
> void Imprimir (Punto &RefP)

Sugiero anteponer 'const' a este parámetro, ya que no tienes intención 
de modificar su contenido.

>     {
>         cout << "\tLas coordenadas del punto son: ["
>              << RefP.coordx << "," << RefP.coordy << "]" << endl << endl;
>     }                               //fin de imprimir ()
>      
> void Leer (Circulo &RefC)
>     {
>         Punto P;
>         RefC.AptP=&P;

Esto es un problema. El miembro 'AptP' apunta a una variable local 'P'. 
Esto significa que al terminar de ejecutar 'Leer()', la variable 'P' es 
destruida y por tanto el miembro 'AptP' apunta a "basura".

>         Leer (P);
>         //cout << P.coordx << P.coordy;
>         cout <<"***" <<  RefC.AptP->coordx << RefC.AptP->coordy;
>         cout <<"***" <<  P.coordx << P.coordy;
>         cout << "\tDATOS DEL CIRCULO\n"
>              << "\tIngresa el radio del circulo : " ;
>         cin  >> RefC.Radio;
>     }                               //fin de leer()
>        

Las funciones restantes parecidas a 'Leer()' tienen el mismo problema. 
La solución es usar memoria creada dinámicamente. Esto supone que tienes 
que liberar tal memoria al final del programa.


Espero que esto te aclare la duda.

Steven





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