2011-01-17 16 views
76

Daha önce hiç görmedim. Bunun ":: sample" için bir yazım hatası olduğunu sanıyordum, ama aslında onu derlediğimde çok kafam karışmıştı. Biri bana yardım etmeme yardım edebilir mi lütfen? Bence goto etiketi yok.C++ 'da "class:" ne anlama geliyor?

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

Anonim sınıf (örneklem miras alınan) örneği x gibi görünüyor. Bunu daha önce hiç görmedim. Belki de C++ 0x? – ssmir

+1

sadece tahmin: Bu, 'sample' türeyen adsız sınıf olabilir mi? – davka

+13

Bu bir "goto" etiketi değil mi? Doğru, 'sınıfın tepesine' gel! –

cevap

78

Bu isimsiz sınıftır ve kolon bu sample gelen özel devralır anlamına gelir.

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

Foo x; 
+9

Vay, bu ilginç. Haklısınız, kapsamda bir sınıf "örnek" var ve sınıf üyeleri temel sınıfa erişiyor. Şimdi anladım. –

+2

@Johannes: Adlandırılmamış sınıfın varsayılan olmayan kurucuları veya yıkıcıları bulunamadığından veya şablon olarak (yerel sınıf olduğu için) kullanılamadığından, bu yaklaşım oldukça sınırlıdır. Bu yapının ne olduğunu merak ediyorum. Yerel sınıflar için bildiğim tek kullanım durumu "tip silme deyimi" dir (yani, bir '' sample * 'döndüren, ancak' sample', erişilemeyen bir taban sınıfıdır). –

+0

@Alexandre gerçek kodda gerçekleşmedi. Oyun alanımdaki dosyalardan biriydi. –

21

gibi görün bunu sample doğan isimsiz sınıftanımlayan düşünüyorum. Ve x, bu adlandırılmamış sınıfın bir değişkendir. ideone de

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

örnek kod: http://www.ideone.com/6Mj8x

PS: Ben erişilebilirlik nedenle struct için class değişti!

1

Bu adsız bir sınıf.

Örn. Ön-C++ 11 yerel fonksiyonlar için yer değiştirmek üzere

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

    nice(0xbeef); 
} 

sample iki nokta üst üste sadece varsayılan devralma kullanılarak sample türetmek anlamına gelir. (yapılar için: public, sınıflar için: private)