2011-01-17 1 views
76

Nunca lo había visto antes. Pensé que era un error tipográfico para ":: sample", pero cuando lo vi compila realmente, estaba muy confundido. ¿Alguien puede ayudarme a averiguar por favor? No creo que sea una etiqueta goto.¿Qué significa "clase:" en C++?

void f() { 
    class: sample { 
    // there were some members declared here 
    } x; 
} 
+5

Parece una clase anónima (que hereda de la muestra) instancia x. Nunca vi esto antes. Tal vez es C++ 0x? – ssmir

+1

simplemente adivinando: ¿podría ser esta clase sin nombre derivada de 'sample'? – davka

+13

¿No es una etiqueta 'goto'? Correcto, 'goto' la parte superior de la' clase'! –

Respuesta

78

Es una clase sin nombre, y el colon significa que hereda privada de sample. Verlo como

class Foo : private sample 
{ 
    // ... 
}; 

Foo x; 
+9

Guau, eso es interesante. Parece que tienes razón, hay una clase de "muestra" en el alcance y los miembros de la clase acceden a la clase base. Ahora veo. –

+2

@Johannes: este es un enfoque bastante limitado, ya que la clase sin nombre no puede tener constructores o destructor no predeterminados, ni puede usarse como plantilla (ya que es una clase local). Me gustaría saber cuál es el uso de esta construcción. El único caso de uso que conozco para clases locales es el "tipo de borrado de idioma" (es decir, devolver una 'muestra *', pero 'muestra' es una clase base inaccesible aquí). –

+0

@Alexandre no sucedió en código real. Era uno de mis archivos de patio de recreo. –

21

Creo que es la definición de una clase sin nombre que deriva desample. Y x es una variable de esa clase sin nombre.

struct sample{ int i;}; 

sample f() 
{ 
    struct : sample 
    { 
    // there were some members declared here 
    } x; 
    x.i = 10; 
    return x; 
} 
int main() 
{ 
     sample s = f(); 
     cout << s.i << endl; 
     return 0; 
} 

Código de ejemplo en Ideone: http://www.ideone.com/6Mj8x

PD: Me cambió class-struct por razones de accesibilidad!

1

Esa es una clase sin nombre.

Puede usarlos, p. para sustituir las funciones locales en pre-C++ 11:

int main() { 
    struct { 
     int operator() (int i) const {     
      return 42; 
     } 
    } nice; 

    nice(0xbeef); 
} 

El colon seguido por sample simplemente significa derivan de sample utilizando la herencia predeterminada. (para structs: public, for classes: private)