क्या है यह पागल C ++ 11 वाक्यविन्यास ==> संरचना: बार {} foo {} ;?


168

संभवतः C ++ 11 में इसका क्या अर्थ हो सकता है?

struct : bar {} foo {};

दिलचस्प है, क्या आपको यह कुछ के लिए उपयोगी लगा? मुझे लगता है कि यह मजबूत-टाइप (टैग प्रकार) एकल उदाहरण उत्पन्न करने के लिए एक चाल है।
alfC

@alfC: विशेष रूप से उपयोगी नहीं, नहीं
9

जवाबों:


262

सबसे पहले, हम एक दलदल मानक सार UDT (उपयोगकर्ता-परिभाषित प्रकार) लेंगे:

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

आइए हम यह भी याद रखें कि हम उसी समय यूडीटी को तुरंत परिभाषित कर सकते हैं, जिसे हम इसे परिभाषित करते हैं:

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

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

आइए उदाहरणों को मिलाएं, और याद रखें कि हम एक यूडीटी को परिभाषित कर सकते हैं जिसका कोई नाम नहीं है :

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

हमें अनाम यूडीटी के बारे में किसी और प्रमाण की आवश्यकता नहीं है, इसलिए हम शुद्ध आभासी फ़ंक्शन खो सकते हैं। इसके अलावा का नाम बदलने 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 ++ की तुलना में C ++ 0x एक अधिक जटिल भाषा क्यों बन रही है। कौन चाहता है? एक प्रोग्रामिंग भाषा के क्या फायदे हैं जो अधिक से अधिक गूढ़ हो रहे हैं? यह घोषणापत्र IMHO का एक और उदाहरण है। मैं कई वर्षों से C ++ का उपयोग कर रहा हूं और मुझे अभी भी इस भाषा में महारत हासिल करने में मुश्किलें आ रही हैं।
जियोर्जियो

26
@ जियोर्जियो: यह एक समस्या क्यों है? क्या वास्तव में आपको डराता है? वर्णित निर्माण एक फ्रिंज केस है जिसे भाषा द्वारा अनुमति दी जाती है और इसके मूल अवधारणाओं से स्वाभाविक रूप से अनुसरण होता है, इसके साथ कुछ भी गलत नहीं है। यह बहुत सीमित उपयोगिता का भी है। आपको इसका इस्तेमाल कभी नहीं करना पड़ेगा। हालाँकि, यह वाक्यात्मक रूप से तार्किक है और किसी भी चीज़ से टकराता या टकराता नहीं है। तो, यह एक भाषा के खिलाफ एक तर्क क्यों होगा , विशेष रूप से एक जो असाधारण रूप से अच्छी तरह से डिज़ाइन किया गया है?
केरेक एसबी

13
@ जियोर्जियो - अद्भुत हिस्सा यह है कि स्थिति बिल्कुल विपरीत है; c ++ 0x क्रिप्टिक या बहुत बदसूरत होने के बिना बहुत से प्रतीक्षित शक्तिशाली सुविधाओं को जोड़ रहा है; आप गुप्त चाहते हैं? - पर्ल की जाँच करें। यह उदाहरण यहाँ लगभग गुप्त के शीर्षक के करीब आता है।
बुश में

18
@Kerrek SB मुझे लगता है कि C ++ (और अब C ++ 0x) में बहुत अधिक भिन्न अवधारणाएं हैं और वाक्य रचना और शब्दार्थ सीखना मुश्किल है। प्रत्येक प्रोग्रामर (मैं उनमें से एक हूं) भाषा के सबसेट का उपयोग करके समाप्त होता है क्योंकि एक ही काम करने के कई अलग-अलग तरीके हैं। मुझे नहीं लगता कि C ++ अच्छी तरह से डिज़ाइन किया गया है। कई तदर्थ विशेषताएं और कुछ बुनियादी चीजें हैं जैसे कि एक मजबूत मॉड्यूल (आयात / निर्यात) तंत्र गायब है (अभी भी सी से पुराने #include का उपयोग करके)। मुझे लगता है कि C ++ 0x प्रयास को C ++ को छोटा और उपयोग करने में आसान बनाना चाहिए, न कि बड़ा।
जियोर्जियो

31
@ जिओर्जियो: ईमानदार होने के लिए, इस तरह के किसी भी प्रयास को सी ++ को जमीन से ऊपर उठाने, यानी एक नई भाषा बनाने पर काम करना होगा । और वह है किया गया ... कई बार।
को ऑर्बिट

106

यह परिभाषित करता है:

  • एक अनाम संरचना,
  • जो सार्वजनिक रूप से लिया गया है bar
  • जो ( anonymously) और कुछ नहीं परिभाषित करता है, लेकिन इससे क्या प्राप्त होता हैbar
  • और अंत में, "फू" नामक एक उदाहरण बनाया जाता है,
  • खाली इनिशियलाइज़र सूची के साथ

struct : bar {} foo {};
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.