दिलचस्प पोस्ट
javax.mail.AuthhenticationFailed जावा में ईमेल भेजने के दौरान एक्सपेशशन फेंका गया है एसटीएल नक्शे के लिए ऑपरेटर कंट क्यों नहीं है? टुकड़ा जोड़ने या काम नहीं बदले क्या Xcode में चेतावनियों को दबाने का कोई तरीका है? पायथन में इकाई परीक्षणों का क्रम बदलना मैं एक प्री टैग में पाठ कैसे लपेटूं? एसडी कार्ड से ईमेल भेजने की कोशिश कर रहा है I वेब। Xml में संसाधन-रिफ में क्या उपयोग किया जाता है? चयनित तत्व का बाहरी HTML प्राप्त करें jQuery / जेएस, आईओएस 4 और $ (दस्तावेज़) .हाइट () समस्याओं RegisterNatives () विधि क्या करती है? सबमिट करने पर चेकबॉक्स मान प्राप्त करना अजगर पांडा – कैसे स्तंभों में एक पदानुक्रमित सूचकांक समतल विशिष्ट कैप्शन / शीर्षक के साथ खिड़कियों को खोजने के लिए मैं कैसे EnumWindows का उपयोग कर सकता हूं? Stdin और stdout से पढ़ना (यूनिक्स / लिनक्स / सी प्रोग्रामिंग)

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

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

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; };