2011-01-17 6 views
76

私はこれまで見たことがありません。私はそれが ":: sample"のtypoだと思っていましたが、実際にコンパイルしたのを見たとき、私は非常に混乱しました。誰かが私を見つけて助けてくれますか?私はそれがgotoラベルだとは思わない。"class:"はC++で何を意味しますか?

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

(サンプルから継承する)インスタンスxのように見えます。以前はこれを見たことがありません。多分それはC++ 0xですか? – ssmir

+1

ちょうど推測:これは 'sample'から派生した無名クラスですか? – davka

+13

「goto」ラベルではありませんか?正解、 'goto'は' class'のトップです! –

答えて

78

無名のクラスであり、コロンはsampleから個人的に継承することを意味します。

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

Foo x; 
+9

うわー、面白いです。あなたが正しいと思われます。スコープにクラス "sample"があり、クラスメンバーはベースクラスにアクセスします。わかりました。 –

+2

@Johannes:名前のないクラスはデフォルトのコンストラクタやデストラクタを持つことができず、(ローカルクラスであるため)テンプレートとしても使用できないため、これはかなり限定されたアプローチです。私はこの構成の使用が何であるか興味があります。私がローカルクラスで知っている唯一のユースケースは、 "型消去イディオム"です(つまり、 'sample *'を返すが、 'sample'はここではアクセスできない基本クラスです)。 –

+0

@Alexandreそれは実際のコードでは起こりませんでした。それは私の遊び場ファイルの一つでした。 –

21

ようにそれを参照してください。私はそれがsample由来の無名クラスを定義していると思います。 xはその名前のないクラスの変数です。

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

ideoneのサンプルコード:http://www.ideone.com/6Mj8x

PS:私は、アクセシビリティの理由structclassを変更!

1

これは名前のないクラスです。

プレC++ 11にローカル機能を置換する:

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

    nice(0xbeef); 
} 

sample続くコロンは単にデフォルトの継承を用いsample由来することを意味します。

関連する問題