¡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.11.2a3  Clases locales

§1  Sinopsis

Las clases C++ pueden ser declaradas dentro de funciones; en cuyo caso se denominan clases locales. Tanto el identificador como la propia clase pertenecen al ámbito de la función contenedora. Ejemplo:

void foo () {
   ...
   class C { ... };
   ...
   C c1;    // Ok.
}
...
C c2;       // Error!! C no es visible


§2
  La función contenedora no tiene especial acceso al ámbito de la clase local (salvo el dictado por las reglas generales):

void foo() {       // Función contenedora
   ...
   class C {       // clase local a foo
      int x;       // privado por defecto
      public:
      char c;
   };
   C c;
   c.x = 10;       // Error!! el miembro es privado
   c.c = 'X';      // Ok.
}

El error puede ser eliminado con un pequeño cambio que permita la visibilidad de foo en el interior de la clase:

void foo() {
   ...
   class C {
      friend void foo();  // se permite el acceso
      int x;
      public:
      char c;
   };
   C c;
   c.x = 10;       // Ok!! aunque el miembro es privado
   c.c = 'X';      // Ok.
}


§3  La clase local solo puede utilizar typenames ( 3.2.1e); objetos estáticos ( 4.11.7) y enumeradores ( 4.8) del ámbito de la función contenedora. Ejemplo:

void foo() {
   static int counter;
   enum { KT1 = 33 };
   int y = 2;

   class C {
     int x;
     public:
     C() {
        x = KT1 + counter;   // Ok.
     C(int n) {
        x = n + y;           // Error!! y es automática
     }
   };
}


§4
  La clase local no puede contener miembros estáticos ( 4.11.7).  Ejemplo:

void foo() {
   ...
   class C {
     int x;               // Ok.
     static int y;        // Error!!
     public:
     void f1();           // Ok.
     static void f2();    // ERror!!
     ...
   };
}

§3    Tema relacionado
  • Clases dentro de clases ( 4.13.2)