2011-01-17 15 views
76

Ich habe es noch nie zuvor gesehen. Ich dachte, es wäre ein Tippfehler für "Sample", aber als ich sah, dass es tatsächlich kompiliert, war ich sehr verwirrt. Kann mir bitte jemand helfen? Ich glaube nicht, dass es ein goto Label ist.Was bedeutet "Klasse:" in C++?

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

Sieht aus wie eine anonyme Klasse (die von Beispiel erbt) Instanz x. Habe das noch nie gesehen. Vielleicht ist es C++ 0x? – ssmir

+1

nur raten: Könnte das eine unbenannte Klasse sein, die von 'sample' abgeleitet ist? – davka

+13

Es ist kein 'Goto'-Label? Korrekt, 'gehe 'an die Spitze der' Klasse'! –

Antwort

78

Es ist eine unbenannte Klasse, und der Doppelpunkt bedeutet es privat von sample erbt. Sehen Sie es wie

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

Foo x; 
+9

Wow, das ist interessant. Es scheint, dass Sie Recht haben, es gibt eine Klasse "Beispiel" im Bereich und die Klassenmitglieder greifen auf die Basisklasse zu. Jetzt sehe ich. –

+2

@Johannes: Dies ist ein ziemlich begrenzter Ansatz, da die unbenannte Klasse keine Standardkonstruktoren oder -destruktoren haben kann und auch nicht als Vorlage verwendet werden kann (da es sich um eine lokale Klasse handelt). Ich würde neugierig sein, was die Verwendung dieses Konstrukts ist. Der einzige Anwendungsfall, den ich für lokale Klassen kenne, ist das "type errasure idiom" (dh ein 'sample *' wird zurückgegeben, aber 'sample' ist hier eine nicht zugängliche Basisklasse). –

+0

@Alexandre es ist nicht in realem Code geschehen. Es war eine meiner Spielplatzdateien. –

21

denke ich, dass eine unbenannte Klasse ist die Definition Ableitung von sample. Und x ist eine Variable dieser unbenannten Klasse.

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; 
} 

Beispielcode bei ideone: http://www.ideone.com/6Mj8x

PS: Ich änderte class-struct für die Zugänglichkeit Grund!

1

Das ist eine unbenannte Klasse.

Sie können sie z.B. als Ersatz für lokale Funktionen in Pre-C++ 11: Verwendung von Standard-Vererbung einfach

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

    nice(0xbeef); 
} 

Der Doppelpunkt, gefolgt von sample bedeutet von sample abzuleiten. (für Strukturen: öffentlich, für Klassen: privat)