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.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)