¿Qué significa "clase:" en C ++?

78

Nunca lo había visto antes. Pensé que era un error tipográfico para ":: sample", pero cuando vi que en realidad se compila, estaba muy confundido. ¿Alguien puede ayudarme a averiguarlo, por favor? No creo que sea una gotoetiqueta.

void f() {
  class: sample {
    // there were some members declared here
  } x;
}
Johannes Schaub - litb
fuente
5
Parece una clase anónima (que hereda de la muestra) instancia x. Nunca vi esto antes. ¿Quizás sea C ++ 0x?
ssmir
1
solo adivinando: ¿podría esta clase sin nombre derivada sample?
davka
13
¿No es una gotoetiqueta? Correcto, gotola parte superior del class!
CB Bailey
4
Ni siquiera me di cuenta de que eras tú. No.
Lightness Races in Orbit
@Johannes Consulte esta propuesta de revisión de código si aún no lo ha hecho. El sitio definitivamente puede beneficiarse de su destreza en C ++.
greatwolf

Respuestas:

81

Es una clase sin nombre y los dos puntos significan que hereda de forma privada sample. Verlo como

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

Foo x;
Alexandre C.
fuente
9
Wow eso es interesante. Parece que tiene razón, hay una clase "muestra" en el alcance y los miembros de la clase acceden a la clase base. Ahora veo.
Johannes Schaub - litb
2
@Johannes: este es un enfoque bastante limitado, ya que la clase sin nombre no puede tener constructores o destructores no predeterminados, ni puede usarse como plantilla (ya que es una clase local). Tendría curiosidad por saber cuál es el uso de esta construcción. El único caso de uso que conozco para las clases locales es el "modismo de borrado de tipo" (es decir, devolver un sample*, pero samplees una clase base inaccesible aquí).
Alexandre C.
@Alexandre no sucedió en código real. Era uno de mis archivos de juegos.
Johannes Schaub - litb
1
No es una instancia de clase sin nombre; es una clase sin nombre.
Lightness Races in Orbit
21

Creo que eso es definir una clase sin nombre que se deriva de sample. Y xes 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 muestra en ideone: http://www.ideone.com/6Mj8x

PD: ¡Cambié classa structpor motivos de accesibilidad!

Nawaz
fuente
2

Esa es una clase sin nombre.

Puede usarlos, por ejemplo, para sustituir funciones locales en pre-C ++ 11:

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

    nice(0xbeef);
}

Los dos puntos seguidos de samplesimplemente significa derivan del sampleuso de la herencia predeterminada . (para estructuras: público, para clases: privado)

Sebastián Mach
fuente