2011-01-17 17 views
76

Nigdy wcześniej tego nie widziałem. Pomyślałem, że to był literówka dla ":: sample", ale kiedy zobaczyłem, że to faktycznie kompiluje, byłem bardzo zdezorientowany. Czy ktoś może mi pomóc dowiedzieć się? Nie sądzę, że jest to etykieta goto.Co oznacza "klasa:" w C++?

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

Wygląda jak anonimowa klasa (która dziedziczy po próbce) z instancji x. Nigdy tego wcześniej nie widziałem. Może to C++ 0x? – ssmir

+1

po prostu zgaduję: czy to może być nienazwana klasa wywodząca się z "próbki"? – davka

+13

To nie jest etykieta "goto"? Prawidłowo, 'goto' na szczycie' klasy'! –

Odpowiedz

78

Jest nienazwany klasa, a dwukropek oznacza to dziedziczy prywatnie z sample. Zobacz jak

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

Foo x; 
+9

Wow, to interesujące. Wygląda na to, że masz rację, istnieje klasa "próbka" w zakresie, a członkowie klasy mają dostęp do klasy bazowej. Teraz widzę. –

+2

@Johannes: jest to dość ograniczone podejście, ponieważ nienazwana klasa nie może mieć domyślnych konstruktorów ani destruktorów, ani nie może być używana jako szablon (ponieważ jest to klasa lokalna). Byłbym ciekawy, jaki jest pożytek z tego konstruktu. Jedyny przypadek użycia, jakiego znam dla klas lokalnych, to "idiom typu wymazania" (tj. Zwrócenie 'próbki *', ale 'sample' jest tu niedostępną klasą bazową). –

+0

@Alexandre to się nie stało w prawdziwym kodzie. To był jeden z moich plików z zabawkami. –

21

myślę, że jest definiowania nienazwany klasa wynikające z sample. I x jest zmienną tej nienazwanej klasy.

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

Przykładowy kod w ideone: http://www.ideone.com/6Mj8x

PS: Zmieniłem class do struct o dostępności powodu!

1

To nienazwana klasa.

Możesz ich użyć np. do zastępowania funkcji lokalnych pre-C++ 11:

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

    nice(0xbeef); 
} 

Okrężnica następnie sample oznacza, wynikają z sample użyciu domyślnej spadku. (dla structs: public, dla klas: private)