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.11.3a  Estructuras anónimas

 

Nota: características como las descritas a continuación, que no son estándar del lenguaje, sino particularidades de algunos compiladores, son desaconsejables.

§1  Presentación

El ANSI C++ permite solamente estructuras anónimas que declaren un objeto (como en &3 ), pero el compilador Borland C++ permite varios tipos de estructuras anónimas que extienden el ANSI (que no declaren un objeto, como en &2 ).

Estas estructuras anónimas tienen la siguiente forma:

struct { lista-de-miembros };


&2  Estas estructuras anónimas deben ser anidadas, es decir, declaradas dentro de otra clase (clase,  estructura o unión) por ejemplo:

struct my_struct {
  int x;
  struct {     // estructura anónima anidada en my_struct
    int i;
  };
  inline int func1(int y);
} ;


&3  La estructura externa debe estar identificada, es decir, tener un nombre (como en el ejemplo anterior) o declarar un objeto como en el ejemplo que sigue (también pueden tener ambas cosas):

struct {
  int x;
  struct {     // estructura anónima anidada en my_struct
    int i;
  };
  inline int func1(int y);
} S;


&4  Puesto que no existe variable de instancia, la sintaxis C++ para las estructuras anónimas no pueden referenciar el puntero this ( 4.11.6). Por consiguiente, mientras que las estructuras C++ tienen generalmente funciones miembro, las anónimas no pueden tenerlas (solo pueden tener datos). Estos datos (propiedades) pueden ser accedidos directamente, dentro del ámbito en que la estructura ha sido declarada, sin utilizar la sintaxis x.y o p->y.

Ejemplo

#include <iostream>
using namespace std;
 
struct my_struct {
  int x;
  struct{         // estructura anónima anidada
    int i;
  };
  int func1(int y) {return y + i + x;}
} S;

int main() {      // ================
  S.x = 6;
  S.i = 4;        // Observe este acceso al miembro i
  int y = S.func1(3);
  cout << "y == " << y << endl;
  return 0;
}

Salida:

y == 13