Bu çılgın C ++ 11 sözdizimi nedir ==> struct: bar {} foo {} ;?


Yanıtlar:


262

İlk olarak, bir bataklık standardı soyut UDT (Kullanıcı Tanımlı Tip) alacağız:

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

UDT'yi tanımladığımız zamanda başlatabildiğimizi de hatırlayalım:

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

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

Örnekleri birleştirelim ve adı olmayan bir UDT tanımlayabileceğimizi hatırlayalım :

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

Artık anonim UDT ile ilgili kanıtlara ihtiyacımız yok, bu yüzden saf sanal işlevi kaybedebiliriz. Ayrıca yeniden adlandırılması instanceiçin foo, biz kalacaksın:

struct {} foo;

Yakınlaşmak.


Şimdi, bu anonim UDT bir bazdan türetilseydi?

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

Son olarak, C ++ 11 , bu gibi kafa karıştırıcı şeyler yapabilmemiz için genişletilmiş başlatıcılar sunar :

int x{0};

Ve bu:

int x{};

Ve son olarak, bu:

struct : bar {} foo {};

Bu, boş bir başlatıcı ile foo olarak başlatılan, çubuktan türeyen isimsiz bir yapıdır.


11
Bir programlama dili hakkında olumsuz yorumlardan kaçınılması gerektiğini biliyorum ve belki de burada biraz konu dışı. Ama neden C ++ 0x C ++ daha karmaşık bir dil haline geliyor anlamıyorum. Bunu kim ister? Giderek daha şifreli hale gelen bir programlama dilinin avantajları nelerdir? Bu beyan IMHO'dur ve bunun bir başka örneğidir. Yıllardır C ++ kullanıyorum ve hala bu dilde ustalaşmakta zorluk çekiyorum.
Giorgio

26
@Giorgio: Bu neden bir sorun? Seni tam olarak korkutan nedir? Açıklanan yapı, dilin izin verdiği ve temel kavramlarından doğal olarak takip eden bir saçak durumudur, bununla ilgili yanlış bir şey yoktur. Aynı zamanda çok sınırlı fayda sağlar. Asla kullanmak zorunda kalmayacaksınız. Ancak, sözdizimsel olarak mantıklıdır ve hiçbir şeyle çarpışmaz veya çatışmaz. Öyleyse, bu neden bir dile, özellikle de olağanüstü iyi tasarlanmış bir dile karşı bir argüman olsun ?
Kerrek SB

13
@Giorgio - harika kısmı durumun tam tersi; c ++ 0x, şifrelenmemiş veya çok çirkin olmadan, çok fazla beklenen güçlü tesis ekliyor; şifreli mi istiyorsun? - Perl. Buradaki bu örnek neredeyse hiçbir yerde şifreli başlığa yaklaşmıyor.
Gene Bushuyev

18
@Kerrek SB Bence C ++ (ve şimdi C ++ 0x) çok fazla farklı kavramlara sahip ve sözdizimi ve anlambilimi öğrenmek zor. Her programcı (ben onlardan biriyim) dilin bir alt kümesini kullanır, çünkü aynı şeyi yapmanın çok farklı yolları vardır. C ++ iyi tasarlanmış olduğunu düşünmüyorum. Birçok geçici özellik vardır ve sağlam bir modül (içe aktarma / dışa aktarma) mekanizması gibi bazı temel şeyler eksiktir (hala C'den eski #include kullanılıyor). C ++ 0x çaba C ++ daha büyük değil, daha küçük ve kullanımı kolay hale getirmeyi amaçlamalı düşünüyorum.
Giorgio

31
@Giorgio: Dürüst olmak gerekirse, böyle bir çaba, C ++ 'ı sıfırdan yeniden inşa etmek, yani yeni bir dil oluşturmak için çalışmak zorunda kalacaktı . Ve bu etmiştir ... defalarca yapılmıştır.
Yörüngedeki Hafiflik Yarışları

106

Bu şunları tanımlar:

  • anonim bir yapı,
  • herkese açık olarak türetilmiş bar
  • hangi ( anonymously) türettiklerinden başka bir şey tanımlamazbar
  • ve son olarak, "foo" adı verilen bir örnek oluşturulur,
  • boş bir başlangıç ​​listesiyle

struct : bar {} foo {};
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.