Was bedeutet "Klasse:" in C ++?


78

Ich habe es noch nie gesehen. Ich dachte, es wäre ein Tippfehler für ":: sample", aber als ich sah, dass es tatsächlich kompiliert wurde, war ich sehr verwirrt. Kann mir bitte jemand helfen, es herauszufinden? Ich denke nicht, dass es ein gotoLabel ist.

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

5
Sieht aus wie eine anonyme Klasseninstanz x (die vom Beispiel erbt). Ich habe das noch nie gesehen. Vielleicht ist es C ++ 0x?
Ssmir

1
nur raten: könnte dies eine unbenannte Klasse sein, von der sie stammt sample?
Davka

13
Es ist kein gotoLabel? Richtig, gotodie Spitze der class!
CB Bailey

4
Ich habe nicht einmal bemerkt, dass du das bist. Pfft.
Leichtigkeitsrennen im Orbit

@Johannes Sehen Sie sich diesen Vorschlag zur Codeüberprüfung an, falls Sie dies noch nicht getan haben. Die Site kann definitiv von Ihren C ++ - Fähigkeiten profitieren.
Urwolf

Antworten:


81

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

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

Foo x;

9
Wow, das ist interessant. Es scheint, Sie haben Recht, es gibt eine Klasse "sample" im Gültigkeitsbereich und die Klassenmitglieder greifen auf die Basisklasse zu. Jetzt sehe ich.
Johannes Schaub - litb

2
@Johannes: Dies ist ein ziemlich begrenzter Ansatz, da die unbenannte Klasse keine nicht standardmäßigen Konstruktoren oder Destruktoren haben kann und auch nicht als Vorlage verwendet werden kann (da es sich um eine lokale Klasse handelt). Ich wäre gespannt, was die Verwendung dieses Konstrukts ist. Der einzige Anwendungsfall, den ich für lokale Klassen kenne, ist das "Typ-Lösch-Idiom" (dh das Zurückgeben von a sample*, ist aber samplehier eine unzugängliche Basisklasse).
Alexandre C.

@Alexandre es ist nicht in echtem Code passiert. Es war eine meiner Spielplatzdateien.
Johannes Schaub - litb

1
Es ist keine unbenannte Klasseninstanz. Es ist eine unbenannte Klasse.
Leichtigkeitsrennen im Orbit

21

Ich denke, das definiert eine unbenannte Klasse , die von abgeleitet ist sample. Und xist 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 classhabe structaus Gründen der Barrierefreiheit zu gewechselt !


2

Das ist eine unbenannte Klasse.

Sie können sie beispielsweise verwenden, um lokale Funktionen in Pre-C ++ 11 zu ersetzen:

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

    nice(0xbeef);
}

Der Doppelpunkt, gefolgt von sampleeinfachen Mitteln, leitet sich aus der sampleVerwendung der Standardvererbung ab . (für Strukturen: öffentlich, für Klassen: privat)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.