दिलचस्प पोस्ट
जावा ट्री डेटा संरचना? मेरा ऐप अनइंस्टॉल किया गया है इससे पहले कि एक गतिविधि को कैसे दिखाएं (एंड्रॉइड) Rails माइग्रेशन पर रूबी में डेटाबेस कॉलम का नाम कैसे बदल सकता हूँ? रे त्रुटि: मैक ओएस एक्स पर अवैध बाइट अनुक्रम ईमेल HTML कोड बनाने के लिए सीएसएस शैली को स्वचालित रूप से इनलाइन करने के लिए कौन से उपकरण हैं? कैसे एक चर से गतिविधि को टुकड़ा पारित करने के लिए, और इसे वापस पास? बाश में, शेल आज्ञाएं तर्कों में उद्धरणों को क्यों अनदेखा करती हैं, जब तर्क उन्हें एक चर के रूप में पारित किया जाता है? HTTP POST अनुरोध में पैरामीटर कैसे भेजे जाते हैं? जावास्क्रिप्ट: फ़ाइल अपलोड करें ह्यूवाइ फोन पर "संरक्षित ऐप्स" सेटिंग, और इसे कैसे प्रबंधित करें रिच टेक्स्टबॉक्स वाइफ़एफ बंधन iPhone / iOS JSON पार्सिंग ट्यूटोरियल क्या घटना संचालकों को अपंजीकृत करने के लिए बुरा है? क्लिक किए गए बटन की आईडी प्राप्त करने के लिए JavaScript – onClick LINQ का उपयोग करके सूची में डुप्लिकेट निकालें

इंजेक्शन वाले वर्ग का नाम क्यों है?

हाल ही में, मैंने एक अजीब सी ++ सुविधा देखा: इंजेक्शन वर्ग का नाम

class X { }; X x1; class X::X x2; // class X::X is equal to X class X::X::X x3; // ...and so on... 

लेकिन मैं समझ नहीं पा रहा हूं कि यह सुविधा क्यों आवश्यक है। क्या कोई ऐसा अभ्यास है जिसे इस सुविधा की आवश्यकता है?

और मैंने सुना है कि यह सुविधा पुराने सी ++ में मौजूद नहीं थी तब, कब शुरू किया गया था? सी ++ 03? सी ++ 11?

वेब के समाधान से एकत्रित समाधान "इंजेक्शन वाले वर्ग का नाम क्यों है?"

इंजेक्टेड वर्ग नाम का मतलब है कि X को X सदस्य के रूप में घोषित किया जाता है, ताकि X अंदर नाम की तलाश में हमेशा वर्तमान वर्ग पायेगा, न कि एक अन्य X , जिसे एक ही समेटे हुए दायरे में घोषित किया जा सकता है, उदा।

 void X() { } class X { public: static X create() { return X(); } }; 

क्या create() फ़ंक्शन एक अस्थायी X ऑब्जेक्ट बनाने या फंक्शन X बुला रहा है? नेमस्पेस क्षेत्र में यह फ़ंक्शन कॉल करेगा, इसलिए इंजेक्शन-क्लास-नाम का उद्देश्य यह सुनिश्चित करना है कि X के शरीर के भीतर हमेशा नाम ही वर्ग पाता है (क्योंकि नाम लुकअप क्लास में शुरू होता है 'अपने क्षेत्र में देखने से पहले गुंजाइश संलग्न)

यह क्लास टेम्प्लेट्स के अंदर भी सहायक होता है, जहां इंजेक्शन वाले क्लास का नाम किसी टेम्पलेट तर्क सूची के बिना उपयोग किया जा सकता है, उदाहरण के लिए पूर्ण टेम्पलेट- id Foo<blah, blah, blah> बजाय बस Foo का उपयोग करना, इसलिए वर्तमान तात्कालिकता का संदर्भ देना आसान है । सी ++ 98 और सी + 03 03 के बीच परिवर्तन के लिए डॉ 176 को देखें, जो कि स्पष्ट किया।

इंजेक्शन वर्ग नाम का विचार सी ++ 98 में मौजूद था, लेकिन शब्दावली सी ++ 03 के लिए नया था।

सी ++ 98 कहता है:

वर्ग-नाम को उस क्षेत्र में डाला जाता है जिसमें वर्ग-नाम के बाद इसे तुरंत घोषित किया जाता है। वर्ग के नाम को कक्षा के दायरे में भी डाला जाता है

दूसरी वाक्य डीआर 147 द्वारा बदल दी गई थी, इसलिए सी + 03 03 [वर्ग] / 2 में कहते हैं:

वर्ग-नाम को उस क्षेत्र में डाला जाता है जिसमें वर्ग-नाम के बाद इसे तुरंत घोषित किया जाता है। वर्ग के नाम को कक्षा के दायरे में भी डाला जाता है; इसे इंजेक्शन-वर्ग-नाम के रूप में जाना जाता है

सी ++ 98 से पहले, एआरएम ने लगभग बराबर शब्दावली का अर्थ है कि क्लास के नाम का उपयोग हमेशा क्लास बॉडी में हमेशा इस्तेमाल किया जा सकता है:

क्लास का नाम क्लास स्पेसिफायर की सदस्य सूची में भी वर्ग-नाम के रूप में इस्तेमाल किया जा सकता है

  • उदाहरण के लिए,

    class link { link* next; };