Duda con respecto a struct dentro de struct

Iniciado por Naimaderis, 1 Abril 2017, 22:14 PM

0 Miembros y 1 Visitante están viendo este tema.

Naimaderis

Hola, ¿Como estan? Me ha surgido una duda, supongamos que yo tengo el siguiente struct:



struct prueba_text {
 char caracteres[20];
 int longitud;
};



Ahora creo el tipo`textito_tip' que es un puntero a los elementos de `prueba_text'.


typedef prueba_text *textito_tip;


Aca es donde viene mi duda, he creado una struct "prueba_text" la cual tiene dos campos, caracteres y longitud, que sucede si yo creo una nueva estructura
cuyos campos sean "int numero" y "textito_tip texto":


struct prueba_info {
 int numero;
 textito_tip texto;
};


Segun mi logica, prueba_info deberia tener 3 campos, "numero" y los dos que toma de "prueba_text" que son "caracteres" y "longitud"

¿Esto es asi?

Si es asi, entonces creo un nuevo tipo "info_tip" el cual es puntero a los elementos de "prueba_info"


typedef prueba_info *info_tip;


La otra duda es, en caso de ser asi, yo para acceder a los elementos de rep_text, lo hacia de la siguiente forma:

textito_tip res = new prueba_text /* lo creo  y ahora accedo:*/
res -> longitud = 4;

mi duda es como accedo ahora, ya que esta dentro de prueba_info,supuse que seria algo asi:

info_tip hola = new prueba_info;
hola -> numero;

y en la parte que "hereda" del otro?
"hola -> longitud" ?

La otra pregunta seria:
Suponiendo que me pasan como parametro de una funcion "info_tip h" entonces para acceder solo tengo que poner
Código (cpp) [Seleccionar]

h -> numero;

o tengo que crear uno nuevo con "new" y asignarle h?

ivancea96

En primer lugar: prueba_info no tiene los campos longitud ni caracteres. Lo único que tiene son 2 campos: numero y texto. Para acceder a longitud y a caracteres, tendrías que hacer: str.texto->longitud

Luego: ¿Por qué punteros? Si usas punteros dentro de la estructura, tendrás que reservar memoria con new también:
Código (cpp) [Seleccionar]
prueba_info* str = new prueba_info();
str->texto = new prueba_text();
str->texto->longitud = 10;


Y otro detalle: usar typedef es útil, pero no de ese modo.. En primer lugar, recuerda que typedef es una herramienta, pero no hay nada que no se pueda hacer sin él. Hacer un typedef de un puntero a un tipo muy rara vez es una buena opción (salvo que el nombre del alias sea muy característico).
Fíjate en el código que puse arriba. Ahora, compara con esta línea:
Código (cpp) [Seleccionar]
textito_tip res = new prueba_text
Asignar un prueba_text* a un textito_tipo no parece algo correcto a primera vista.