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)