ไวยากรณ์ C ++ 11 บ้านี้คืออะไร ==> struct: bar {} foo {} ;?


168

สิ่งนี้อาจหมายถึงอะไรใน C ++ 11

struct : bar {} foo {};

น่าสนใจคุณคิดว่ามันมีประโยชน์สำหรับบางสิ่งหรือไม่? ฉันเดาว่ามันเป็นกลอุบายในการสร้างอินสแตนซ์เดี่ยวที่แข็งแกร่ง (ประเภทที่ติดแท็ก)
alfC

@alfC: ไม่มีประโยชน์อย่างยิ่งไม่มี
Lightness Races ใน Orbit

คำตอบ:


262

อันดับแรกเราจะนำ UDT ที่เป็นนามธรรมที่ไม่เหมาะสม (ประเภทที่กำหนดโดยผู้ใช้):

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;

การเข้าใกล้


ทีนี้จะเกิดอะไรขึ้นถ้า UDT นิรนามนี้มาจากบางฐาน?

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

ในที่สุด C ++ 11 แนะนำผู้เริ่มต้นเพิ่มเติมเช่นเราสามารถทำสิ่งที่สับสนเช่นนี้:

int x{0};

และนี่:

int x{};

และในที่สุดนี้:

struct : bar {} foo {};

นี่คือโครงสร้างที่ไม่มีชื่อที่ได้มาจากแถบยกตัวอย่างเช่น foo ด้วย initializer ว่างเปล่า


11
ฉันรู้ว่าความคิดเห็นเชิงลบเกี่ยวกับภาษาการเขียนโปรแกรมควรหลีกเลี่ยงและอาจเป็นเรื่องเล็กน้อยที่นี่ แต่ฉันไม่เข้าใจว่าทำไม C ++ 0x ถึงกลายเป็นภาษาที่ซับซ้อนยิ่งกว่า C ++ ใครต้องการสิ่งนั้น อะไรคือข้อดีของภาษาการเขียนโปรแกรมที่มีความลับมากขึ้นเรื่อย ๆ ? คำประกาศนี้เป็น IMHO และเป็นอีกตัวอย่างหนึ่งของเรื่องนี้ ฉันใช้ภาษา C ++ มาหลายปีแล้วและยังมีปัญหาในการใช้ภาษานี้เป็นหลัก
จอร์โจ

26
@ จอร์โจ: ทำไมปัญหานี้คืออะไร? คุณกลัวอะไรกันแน่ โครงสร้างที่อธิบายเป็นกรณีที่ได้รับอนุญาตจากภาษาและตามธรรมชาติจากแนวคิดหลักของมันมีอะไรผิดปกติกับมัน มันยังเป็นยูทิลิตี้ที่ จำกัด มาก คุณจะไม่ต้องใช้มัน อย่างไรก็ตามมันมีเหตุผลเชิงตรรกะและไม่ชนหรือขัดแย้งกับสิ่งใด เหตุใดจึงเป็นข้อโต้แย้งกับภาษาโดยเฉพาะอย่างยิ่งภาษาที่ออกแบบมาอย่างดีเยี่ยม?
Kerrek SB

13
@Giorgio - ส่วนที่ยอดเยี่ยมคือว่าสถานการณ์นั้นตรงกันข้าม c ++ 0x กำลังเพิ่มสิ่งอำนวยความสะดวกที่มีประสิทธิภาพมากมายที่รอคอยโดยไม่ต้องมีความลับหรือน่าเกลียดเกินไป คุณต้องการความลับ? - ตรวจสอบ Perl ตัวอย่างนี้ที่นี่ไม่มีทางใกล้ถึงชื่อเรื่องของความลับ
Gene Bushuyev

18
@ Kerrek SB ฉันคิดว่า C ++ (และตอนนี้ C ++ 0x) มีแนวคิดที่แตกต่างกันมากเกินไปและการเรียนรู้ไวยากรณ์และความหมายเป็นเรื่องยาก โปรแกรมเมอร์แต่ละคน (ฉันเป็นหนึ่งในนั้น) จบลงด้วยการใช้ส่วนย่อยของภาษาเพราะมีวิธีที่แตกต่างกันมากเกินไปในการทำสิ่งเดียวกัน ฉันไม่คิดว่า C ++ ออกแบบมาอย่างดี มีคุณสมบัติ Ad-hoc มากมายและสิ่งพื้นฐานบางอย่างเช่นกลไกโมดูล (การนำเข้า / ส่งออก) ที่มีประสิทธิภาพหายไป (ยังคงใช้ #include เก่าจาก C) ฉันคิดว่าความพยายามของ C ++ 0x ควรมุ่งที่จะทำให้ C ++ เล็กลงและใช้งานง่ายขึ้นไม่ใหญ่กว่า
Giorgio

31
@Giorgio: ความซื่อสัตย์ความพยายามใด ๆ ดังกล่าวจะต้องมีการทำงานในการสร้าง c ++ จากพื้นดินขึ้นคือการสร้างภาษาใหม่ และนั่นก็ทำ ... หลายต่อหลายครั้ง
Lightness Races ในวงโคจร

106

สิ่งนี้นิยาม:

  • โครงสร้างที่ไม่ระบุชื่อ
  • ซึ่งได้มาจาก bar
  • ซึ่ง ( anonymously) ไม่ได้กำหนดอะไรนอกจากสิ่งที่ได้มาจากbar
  • และในที่สุดก็มีการสร้างอินสแตนซ์ชื่อว่า "foo"
  • ด้วยรายการ initializer ที่ว่างเปล่า

struct : bar {} foo {};
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.