दिलचस्प पोस्ट
एक बहुत बड़ा पूर्णांक के nth रूट की गणना कैसे करें Google Guava के साथ JavaBeans की सूची फ़िल्टर करना फैक्टरी डिज़ाइन पैटर्न को कार्यान्वित करते समय 'इंस्टॉलेशनफ' से कैसे बचें? आईडी में वर्ग कोष्ठक शामिल होने पर ID द्वारा DOM तत्व ढूंढें? एक अलग div में लगातार ओवरफ़्लो पाठ? पायथन की शब्दकोश में थ्रेड सुरक्षा इकाई फ़्रेमवर्क कोर में संग्रहीत कार्यविधियाँ कैसे चलाने के लिए? विशिष्ट प्रारूप में Java.util.Date प्रदर्शित करें क्या जावा 8 में एक अच्छा विचार कैशिंग है? विम: ओएस एक्स क्लिपबोर्ड को कॉपी चयन कैटमुल-रोम वक्र कोई cusps और कोई आत्म-चौराहों के साथ जावास्क्रिप्ट में एक स्ट्रिंग के पीछे किसी संख्या को अल्पविराम के रूप में फ्लोट में दशमलव बिंदु के रूप में परिवर्तित करना AngularJS में एक निर्देश से मूल नियंत्रक की कॉलिंग विधि एक चरित्र की अंतिम घटना से पहले उप-स्ट्रिंग प्राप्त करने के लिए php स्ट्रिंग फंक्शन

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

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

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?

Solutions Collecting From Web of "इंजेक्शन वाले वर्ग का नाम क्यों है?"

इंजेक्टेड वर्ग नाम का मतलब है कि 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; };