Що це за шалений синтаксис C ++ 11 ==> struct: bar {} foo {} ;?


168

Що це могло означати у C ++ 11?

struct : bar {} foo {};

Цікаво, чи вважаєте ви корисним щось? Я думаю, що це хитрість створення однотипних екземплярів із сильним типом (типів з тегами).
alfC

@alfC: Не особливо корисно, ні
гонки легкості в орбіті

Відповіді:


262

Спочатку ми візьмемо базовий абстрактний UDT (User-Defined Type):

struct foo { virtual void f() = 0; }; // normal abstract type
foo obj;
// error: cannot declare variable 'obj' to be of abstract type 'foo'

Згадаймо також, що ми можемо інстанціювати UDT одночасно, коли ми його визначаємо:

struct foo { foo() { cout << "!"; } };          // just a definition

struct foo { foo() { cout << "!"; } } instance; // so much more
// Output: "!"

Давайте поєднаємо приклади та нагадаємо, що ми можемо визначити UDT, який не має імені :

struct { virtual void f() = 0; } instance; // unnamed abstract type
// error: cannot declare variable 'instance' to be of abstract type '<anonymous struct>'

Нам більше не потрібні докази щодо анонімного UDT, тому ми можемо втратити чисту віртуальну функцію. Крім того, перейменування instanceдо foo, ми залишилися з:

struct {} foo;

Наближаючись.


А що робити, якщо ця анонімна УДТ отримана з якоїсь бази?

struct bar {};       // base UDT
struct : bar {} foo; // anonymous derived UDT, and instance thereof

Нарешті, C ++ 11 представляє розширені ініціалізатори , щоб ми могли робити такі плутані речі:

int x{0};

І це:

int x{};

І, нарешті, ось що:

struct : bar {} foo {};

Це неназвана структура, що походить від рядка, інстанціюється як foo з порожнім ініціалізатором.


11
Я знаю, що слід уникати негативних коментарів щодо мови програмування, і, можливо, це тут трохи поза темою. Але я не розумію, чому C ++ 0x стає ще більш складною мовою, ніж C ++. Хто цього хоче? У чому переваги мови програмування, яка стає все більш виразною? Ця декларація є ще одним прикладом цього ІМХО. Я використовую C ++ вже багато років, і у мене ще є труднощі в оволодінні цією мовою.
Джорджіо

26
@Giorgio: Чому це проблема? Що саме вас лякає? Описана конструкція - це крайній випадок, дозволений мовою, і, природно, випливає з її основних понять, в цьому немає нічого поганого. Це також дуже обмежена корисність. Вам ніколи не доведеться ним користуватися. Однак це синтаксично логічно і ні з чим не стикається і не конфліктує. Отже, чому це буде аргументом проти мови, особливо тієї, яка надзвичайно добре розроблена?
Керрек СБ

13
@ Джорджо - чудова частина полягає в тому, що ситуація прямо протилежна; c ++ 0x додає багато так очікуваних потужних засобів, не будучи кричущими або занадто потворними; ти хочеш криптовалюти? - перевірити Perl. Цей приклад тут ніде майже не наближається до назви криптовалют.
Гена Бушуєва

18
@Kerrek SB Я думаю, що у C ++ (а зараз C ++ 0x) є занадто багато різних понять, і вивчити синтаксис та семантику складно. Кожен програміст (я один з них) закінчує використання підмножини мови, оскільки існує занадто багато різних способів зробити те саме. Я не думаю, що C ++ добре розроблений. Є багато спеціальних функцій і відсутні деякі основні речі, такі як надійний механізм модуля (імпорту / експорту) (все ще використовується старий #include з C). Я думаю, що зусилля C ++ 0x повинні бути спрямовані на те, щоб зробити C ++ меншим та легшим у використанні, а не більшим.
Джорджіо

31
@Giorgio: Якщо чесно, будь-які подібні зусилля повинні були б працювати над перебудовою C ++ з нуля, тобто створенням нової мови . І це вже було зроблено ... багато разів.
Гонки легкості на орбіті

106

Це визначає:

  • анонімна структура,
  • яка походить від публічно bar
  • який ( anonymously) не визначає нічого іншого, крім того, з чого він походитьbar
  • і нарешті, створюється екземпляр, який називається "foo",
  • із порожнім списком ініціалізатора

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