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.3  Nombres de clases

§1 Objetos anónimos

Los nombres de clase deben ser únicos dentro de su ámbito. Sin embargo, en determinados casos pueden omitirse los nombres de uniones, estructuras y clases, dando lugar a elementos sin nombre (anónimos).

Las clases sin nombre pueden usarse para declarar que determinados elementos son instancias de una determinada clase, pero con el inconveniente de que no pueden declararse instancias adicionales en ninguna otra parte, y que los miembros de la clase no pueden contener constructores ni destructores explícitos; tampoco referencias a ella misma (auto-referencias), por ejemplo, punteros a objetos de la propia clase.  Es la situación siguiente:

class { ... } C1, C2, *pc, arrc[10];

§2  Ventaja de nombres explícitos

La sentencia anterior declara C1, C2, *pc y arrc como elementos derivados de la que se define en el bloque. Sin embargo, no es posible definir nuevos objetos del mismo tipo más adelante; tampoco clases derivadas de ella, cosa que no ocurriría si la clase no fuese anónima. Por ejemplo:

class X { ... } C1, C2, *pc, arrc[10];

 ...

X C4;                  // nueva instancia de X

class Xb : X { ... };  // nueva clase derivada de X

 

Nota:  existe una cierta tradición en C++ de utilizar mayúsculas en la inicial de nombres de clases.

§3  Usar typedefs

En ocasiones, en vez de asignar un nombre a la clase, se utiliza un typedef ( 3.2.1a), lo que es exactamente análogo. Esta sustitución de nombres de clases por "typedefs" es una práctica muy frecuente en las clases y estructuras definidas en los ficheros de cabecera de los propios compiladores.

Aquí existen dos formas posibles de uso: utilizando clases anónimas o nominadas (con nombre). Serían las situaciones siguientes:

typedef class {
  ...
  COMPLEX* cptr;             // Error!!
  COMPLEX() { /* ... */ }    // Error!!
  ~CPMPLEX() { /* ... */ }   // Error!!

} COMPLEX;    // typedef de clase anónima

 ...

COMPLEX c1, *cPtr, arrc[10];

El problema es el ya señalado de que la clase anónima no puede contener constructores o destructores explícitos ni auto-referencias. Por esta razón es muy raro utilizar typdefs sobre clases anónimas. Sí en cambio sobre estructuras:

typedef struct {
  ...
  COMPLEX* cptr;             // Error!!

} COMPLEX;    // typedef de estructura anónima

 ...

COMPLEX c1, *cPtr, arrc[10];

El uso de un typedef con una estructuras y clases nominadas es la solución que suele utilizarse en los ficheros de cabecera de los compiladores. Respondería al siguiente esquema:

typedef class C {
  ...
  C* cptr;    // Ok.
  C() { /* ... */ }    // Ok.
  ~C() { /* ... */ }   // Ok.

} COMPLEX;    // typedef de clase con nombre

 ...

COMPLEC c1, *cPtr, arrc[10];

 

Esta definición permite que los objetos de la clase C puedan contener auto-referencias, así como constructores y destructores explícitos.  Como se ha visto, en ambos casos es posible obtener instancias de la clase o estructura utilizando el typedef en sustitución del nombre.

Nota: el ANSI C++ no permite estructuras anónimas que no declaren un objeto. Sin embargo, aunque los compiladores C++ de Borland y Microsoft lo permiten en algunas circunstancias ( 4.11.3a Estructuras anónimas), recomendamos vivamente seguir el Estándar.