Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


4.5.5a  Crear estructuras mediante funciones

§1  Sinopsis

Es posible definir funciones que devuelvan estructuras "ad hoc".  La creación se controla mediante los argumentos pasados a la función.

§2  Ejemplo

struct punto {int x; int y;}     // define tipo estructura punto
struct rect {                    // define tipo estructura rect
        struct punto p1;         // compuesta de dos estrucutras  
        struct punto p2;         // tipo punto
    }
struct str creapu(int x, int y)  // prototipo de función que devuelve
                                 // una estructura (1)
...
struct str creapu (int x, int y) {  // definición de creapu
  struct punto temp              // declara temp estructura tipo punto
  temp.x = x;
  temp.y = y;
  return temp;
}

Comentario

Observe que en (1) el prototipo anuncia que creapu devuelve una estructura, el detalle de como es dicha estructura hay que buscarlo en el cuerpo de la función. Resulta ser de tipo punto, ya definida anteriormente. Así pues, esta función devuelve una estructura tipo punto.

La función creapu puede utilizarse para crear estructuras dinámicamente, o pasarlas como argumento a funciones. Observe que no existe conflicto entre los nombres de los parámetros y los miembros de temp, ya que pertenecen a espacios de nombres distintos.


  Veamos el primer caso (utilizar creapu para crear dinámicamente dos estructuras) completando el código del ejemplo anterior:

rect screen ;      // define screen, estructura tipo rect
screen.p1 = creapu(0, 0);
screen.p2 = creapu(80, 24);

Por supuesto, en vez de crear individualmente los componentes de screen, también se podría definir una función que cree directamente una estructura tipo rect a partir de cuatro coordenadas. He aquí su definición:

struct rect creascreen(int x1, int y1, int x2, int y2) {
   struct rect temp;
   temp.p1.x = x1;  temp.p1.y = y1;
   temp.p2.x = x2;  temp.p2.y = y2;
   return temp:
}

A partir de aquí se podría haber definido:

struct rect screen = creascreen(0, 0, 80, 24);

Nota: observe que en términos de rendimiento, la eficacia de esta solución es bastante pobre, ya que la invocación anterior supone la creación de dos estructuras: la primera, temp, en el cuerpo de la función. La segunda es una copia de ella en el ámbito de la función invocante (valor devuelto). Cuando las estructuras son muy grandes, la creación y destrucción de tales objetos puede ser muy costoso en términos de tiempo y recursos. Repasar a este respecto el capítulo relativo al "Valor devuelto" de las funciones ( 4.4.7).