Що означає "клас:" у C ++?


78

Я ніколи раніше цього не бачив. Я думав, що це друкарська помилка для ":: sample", але коли я побачив, що це справді компілюється, я був дуже розгублений. Хто-небудь може допомогти мені це дізнатись, будь ласка? Я не думаю, що це gotoярлик.

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

5
Схоже на анонімний клас (який успадковується за зразком) екземпляр x. Ніколи раніше цього не бачив. Може це C ++ 0x?
ssmir

1
просто здогадуючись: чи може це бути безіменний клас, що походить від sample?
davka

13
Це не gotoярлик? Правильно, gotoверх class!
CB Bailey,

4
Я навіть не помітив, що це ти. Pfft.
Гонки легкості на орбіті

@Johannes Перевірте цю пропозицію щодо перегляду коду, якщо ви цього ще не зробили. Сайт може виграти від вашої майстерності на C ++.
greatwolf

Відповіді:


81

Це неназваний клас, і двокрапка означає, що вона успадковує його приватно sample. Подивіться це як

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

Foo x;

9
Ого, це цікаво. Здається, ви маєте рацію, за обсягом є клас "зразок", і члени класу отримують доступ до базового класу. Тепер я бачу.
Йоганнес Шауб - літб

2
@Johannes: це досить обмежений підхід, оскільки неназваний клас не може мати конструкторів чи деструктор, що не є за замовчуванням, і не може бути використаний як шаблон (оскільки це локальний клас). Мені було б цікаво, що таке використання цієї конструкції. Єдиним випадком використання, який я знаю для локальних класів, є "ідіома видалення типу" (тобто повернення a sample*, але sampleтут недоступний базовий клас).
Александр К.

@Alexandre, цього не сталося в реальному коді. Це був один з моїх файлів на дитячому майданчику.
Йоханнес Шауб - літб

1
Це не іменований екземпляр класу; це неназваний клас.
Гонки легкості на орбіті

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: Я змінив classна structз причини доступності!


2

Це безіменний клас.

Ви можете використовувати їх, наприклад, для заміни локальних функцій у версії C ++ 11:

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

    nice(0xbeef);
}

Двокрапка, за якою слідують, sampleпросто означає, що походить від sampleвикористання спадщини за замовчуванням . (для структур: публічний, для класів: приватний)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.