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 {virtualvoid 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 definitionstruct 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{virtualvoid 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 UDTstruct: 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.
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,
Jawaban:
Pertama, kami akan mengambil UDT abstrak standar rawa (Jenis yang Ditentukan Pengguna):
Mari kita juga ingat bahwa kita dapat membuat instance UDT pada saat yang sama kita mendefinisikannya:
Mari kita gabungkan contoh-contohnya, dan ingat bahwa kita dapat mendefinisikan UDT yang tidak memiliki nama :
Kami tidak memerlukan bukti tentang UDT anonim lagi, sehingga kami dapat kehilangan fungsi virtual murni. Juga mengganti nama
instance
menjadifoo
, kita dibiarkan dengan:Mendekat.
Sekarang, bagaimana jika UDT anonim ini berasal dari suatu basis?
Akhirnya, C ++ 11 memperkenalkan inisialisasi yang diperluas , sehingga kami dapat melakukan hal-hal membingungkan seperti ini:
Dan ini:
Dan akhirnya, ini:
Ini adalah struktur tanpa nama yang berasal dari bar, dipakai sebagai foo dengan penginisialisasi kosong.
sumber
Ini mendefinisikan:
bar
anonymously
) tidak mendefinisikan apa pun selain dari mana ia berasalbar
sumber