Apa ini sintaks C ++ 11 gila ==> struct: bar {} foo {} ;?


168

Apa artinya ini dalam C ++ 11?

struct : bar {} foo {};

Menarik, apakah Anda merasa berguna untuk sesuatu? Saya kira itu adalah trik untuk menghasilkan satu contoh yang diketik dengan kuat (tipe yang ditandai).
alfC

@alfC: Tidak terlalu berguna, tidak
Lightness Races di Orbit

Jawaban:


262

Pertama, kami akan mengambil UDT abstrak standar rawa (Jenis yang Ditentukan Pengguna):

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

Mari kita juga ingat bahwa kita dapat membuat instance UDT pada saat yang sama kita mendefinisikannya:

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

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

Mari kita gabungkan contoh-contohnya, dan ingat bahwa kita dapat mendefinisikan UDT yang tidak memiliki nama :

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

Kami tidak memerlukan bukti tentang UDT anonim lagi, sehingga kami dapat kehilangan fungsi virtual murni. Juga mengganti nama instancemenjadi foo, kita dibiarkan dengan:

struct {} foo;

Mendekat.


Sekarang, bagaimana jika UDT anonim ini berasal dari suatu basis?

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

Akhirnya, C ++ 11 memperkenalkan inisialisasi yang diperluas , sehingga kami dapat melakukan hal-hal membingungkan seperti ini:

int x{0};

Dan ini:

int x{};

Dan akhirnya, ini:

struct : bar {} foo {};

Ini adalah struktur tanpa nama yang berasal dari bar, dipakai sebagai foo dengan penginisialisasi kosong.


11
Saya tahu bahwa komentar negatif tentang bahasa pemrograman harus dihindari, dan mungkin itu agak aneh di sini. Tapi saya tidak mengerti mengapa C ++ 0x menjadi bahasa yang lebih kompleks daripada C ++. Siapa yang mau itu? Apa keuntungan dari bahasa pemrograman yang menjadi lebih dan lebih samar? Deklarasi ini adalah contoh lain dari IMHO. Saya telah menggunakan C ++ selama bertahun-tahun dan saya masih mengalami kesulitan untuk menguasai bahasa ini.
Giorgio

26
@Iorgio: Mengapa ini menjadi masalah? Apa yang sebenarnya membuatmu takut? Konstruksi yang dijelaskan adalah kasus pinggiran yang diizinkan oleh bahasa dan mengikuti secara alami dari konsep intinya, tidak ada yang salah dengan itu. Ini juga utilitas yang sangat terbatas. Anda tidak perlu menggunakannya. Namun, ini secara sintaksis logis dan tidak bertabrakan atau bertentangan dengan apa pun. Jadi, mengapa ini menjadi argumen terhadap bahasa, terutama yang dirancang dengan sangat baik?
Kerrek SB

13
@Iorgio - bagian yang indah adalah situasinya justru sebaliknya; c ++ 0x menambahkan banyak fasilitas kuat yang ditunggu-tunggu tanpa menjadi samar atau terlalu jelek; Anda ingin samar? - lihat Perl. Contoh ini di sini hampir tidak mendekati judul cryptic.
Gene Bushuyev

18
@ Gerrek SB Saya pikir C ++ (dan sekarang C ++ 0x) memiliki terlalu banyak konsep yang berbeda dan belajar sintaks dan semantik sulit. Setiap programmer (saya salah satunya) akhirnya menggunakan subset bahasa karena ada terlalu banyak cara berbeda untuk melakukan hal yang sama. Saya tidak berpikir C ++ dirancang dengan baik. Ada banyak fitur ad-hoc dan hal-hal mendasar tertentu seperti mekanisme modul kuat (impor / ekspor) hilang (masih menggunakan #include lama dari C). Saya pikir upaya C ++ 0x harus bertujuan membuat C ++ lebih kecil dan lebih mudah digunakan, tidak lebih besar.
Giorgio

31
@Giorgio: Sejujurnya, segala upaya seperti itu harus bekerja untuk membangun kembali C ++ dari bawah ke atas, yaitu menciptakan bahasa baru . Dan itu telah dilakukan ... berkali-kali.
Lightness Races dalam Orbit

106

Ini mendefinisikan:

  • struct anonim,
  • yang berasal dari publik bar
  • yang ( anonymously) tidak mendefinisikan apa pun selain dari mana ia berasalbar
  • dan akhirnya, sebuah contoh, yang disebut "foo" dibuat,
  • dengan daftar penginisialisasi kosong

struct : bar {} foo {};
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.