¡Nuevo!  por fin disponible la versión 5 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.5a1  Las estructuras C++ como clases

§1 Sinopsis

Las estructuras C++, se implementaron por compatibilidad hacia atrás con el código C clásico, aunque realmente su funcionalidad no era necesaria, ya que las clases sobrepasan ampliamente, y con ventaja, la funcionalidad de las estructuras C.

En realidad, las estructuras C++ son clases (diríamos que "disfrazadas") con algunas particularidades específicas [1]. Por ejemplo, todos sus miembros son públicos. Por esta razón, aunque las clases engloban a las estructuras C, de las que son un superconjunto, gozan de propiedades que estas no tienen.

Su naturaleza de "clases" puede ser puesta de manifiesto con un sencillo ejemplo:

#include <iostream.h>

class B {
  public: int x;
};

struct ST : public B {
  int fun();
};
  
int ST:: fun() { return x; }

class CL: public ST {
  public: int y;
};

int main(void) {     // ===============
  ST s;
  s.x = 10;
  cout << "s.x == " << s.fun() << endl;
  CL c;
  c.x = 20;
  c.y = 30;
  cout << "c.x == " << c.fun() << endl;
  cout << "c.y == " << c.y << endl;
  return 0;
}

Salida:

s.x == 10
c.x == 20
c.y == 30


Resulta evidente que, aparte de su definición (struct); tanto la notación de acceso, como la definición de la propia función-miembro (algo impensable en las estructuras C); las posibilidad de heredar de otras clases y ser utilizada a su vez como clase-base, hacen de la estructura ST una auténtica clase C++.

Subsisten sin embargo algunas peculiaridades de las antiguas estructuras C que no han sido totalmente trasladadas a los compiladores C++.  Por ejemplo, sean las estructuras anidadas:

struct Ext {
  int x;
  struct Int {
    int x;
  };
};

En el C clásico, si no existe en el programa otra estructura con el mismo nombre que la interior, esta puede ser referenciada como si hubiera sido declarada fuera.  Las siguientes sentencias serían equivalentes [2]:

struct Int i;
Ext::Int i;

Sin embargo, su correspondiente traducción a clases:

class Ext {
  public:
  int x;
  class Int {
    public:
    int x;
  };
};

No permite, en ninguno de los compiladores probados, utilizar la expresión:

class Int i;


  Inicio.


[1]  Stroustrup declara que una estructura es un tipo de clase ("a struct is a kind of class"). TC++PL  §10.2.1

[2]  Actualmente esto se cumple para el compilador Borland C++ 5.5 pero no para MS Visual C++ 6.0 ni para GNU GCC 2.95.2