दिलचस्प पोस्ट
रूबी में क्या () करता है? मैं फ़ायरफ़ॉक्स ऐडॉन कैसे लिखूं? सी # परीक्षा अगर उपयोगकर्ता ने किसी फ़ोल्डर में प्रवेश लिखना है ASP.Net त्रुटि: "प्रकार 'foo' दोनों" temp1.dll "और" temp2.dll "में मौजूद है कंसोल के बिना popen के साथ अजगर में एक प्रक्रिया चलाना नाम "XYZ" नाम स्थान में मौजूद नहीं है "clr-namespace: एबीसी" रैक को दिए गए कोई गुप्त विकल्प नहीं :: सत्र :: कुकी चेतावनी? एएसपी.नेट एमवीसी डेटा टाइप एट्रिब्यूट्स का इस्तेमाल करते हुए ई-मेल एड्रेस वैधीकरण सी ++ 11 में टाइपिंगफ 'और' प्रयोग 'के बीच क्या फर्क है? मैं डेटाटाइम पायथन मॉड्यूल का उपयोग करते हुए वर्तमान दिनांक से छह महीने की तारीख कैसे गणना करूं? गैर-लालची में नियमित अभिव्यक्ति कैसे करें? प्रोल मैल प्रोपर्टी जो कि तत्वों को सूचीबद्ध करने के लिए वर्दी लागू करता है पादलेख को पृष्ठ के निचले भाग से सही बनाएं एंड्रॉइड ग्रेडल प्लगइन 0.7.3 का उपयोग करके प्रोजेक्ट में प्री-बिल्ट .so फाइलें जोड़ें विंडोज बैच के लिए हेरेडॉक?

सुपरक्लास कंस्ट्रक्टर को फोन करने के लिए नियम क्या हैं?

उप-वर्ग से सुपरक्लास कंस्ट्रक्टर को कॉल करने के लिए सी ++ नियम क्या हैं?

उदाहरण के लिए, मुझे जावा में पता है, आपको इसे उप-वर्ग के निर्माता की पहली पंक्ति के रूप में करना चाहिए (और यदि आप नहीं करते हैं, तो कोई गैर-एग्रेट सुपर कन्स्ट्रक्टर को एक निहित कॉल माना जाता है – यदि वह गुम है तो आपको एक संकलन त्रुटि दे रही है) ।

वेब के समाधान से एकत्रित समाधान "सुपरक्लास कंस्ट्रक्टर को फोन करने के लिए नियम क्या हैं?"

बेस क्लास कन्स्ट्रक्टर को स्वचालित रूप से आपके लिए बुलाया जाता है यदि उनके पास कोई तर्क नहीं होता है यदि आप किसी तर्क के साथ सुपरक्लास कंस्ट्रक्टर को कॉल करना चाहते हैं, तो आपको उप-वर्ग की कन्स्ट्रक्टर आरंभीकरण सूची का उपयोग करना चाहिए। जावा के विपरीत, C ++ कई उत्तराधिकारों (बेहतर या बदतर के लिए) का समर्थन करता है, इसलिए बेस क्लास को "सुपर ()" के बजाय नाम से जाना चाहिए।

class SuperClass { public: SuperClass(int foo) { // do something with foo } }; class SubClass : public SuperClass { public: SubClass(int foo, int bar) : SuperClass(foo) // Call the superclass constructor in the subclass' initialization list. { // do something with bar } }; 

कंस्ट्रक्टर की प्रारंभिक सूची और यहां पर यहां अधिक जानकारी।

सी ++ में, आपके कन्स्ट्रक्टर में प्रवेश करने से पहले, सभी सुपर क्लासेस और सदस्य चर के लिए कोई-तर्क कंस्ट्रक्टर आपको बुलाया जाता है। यदि आप उन तर्कों को पारित करना चाहते हैं, तो इस "कन्स्ट्रक्टर चेनिंग" के लिए एक अलग वाक्यविन्यास है, जो इस तरह दिखता है:

 class Sub : public Base { Sub(int x, int y) : Base(x), member(y) { } Type member; }; 

अगर इस बिंदु पर कुछ भी फेंकता है, तो कुर्सियां ​​/ सदस्य जो पहले पूरा निर्माण कर चुके थे, उनके डिस्ट्रक्टर्स को बुलाया जाता है और कॉलर को अपवाद फिर से किया जाता है। यदि आप चेनिंग के दौरान अपवादों को पकड़ना चाहते हैं, तो आपको किसी फ़ंक्शन का उपयोग ब्लॉक का उपयोग करना होगा:

 class Sub : public Base { Sub(int x, int y) try : Base(x), member(y) { // function body goes here } catch(const ExceptionType &e) { throw kaboom(); } Type member; }; 

इस रूप में, ध्यान दें कि फ़ंक्शन के शरीर के अंदर होने की बजाय, कोशिश ब्लॉक फ़ंक्शन का शरीर है; यह इसे अन्तर्निहित या स्पष्ट सदस्य और बेस क्लास इनिशियलाइजेशन के साथ-साथ फ़ंक्शन के शरीर के दौरान फेंकने के अपवादों को पकड़ने की अनुमति देता है। हालांकि, यदि फ़ंक्शन कैच ब्लॉक में एक अलग अपवाद नहीं फेंकता, तो रनटाइम मूल त्रुटि को पुनः स्थापित कर देगी; प्रारंभ के दौरान अपवादों को अनदेखा नहीं किया जा सकता।

सी ++ में कंस्ट्रक्टर की प्रारंभिक सूची की एक अवधारणा है, यह वह जगह है जहां आप बेस क्लास कन्स्ट्रक्टर को कॉल कर सकते हैं और आपको डाटा सदस्यों को भी आरंभ करना चाहिए। प्रारंभिक सूची एक बृहदान्त्र के बाद और कन्स्ट्रक्टर के शरीर के समक्ष निर्माता के हस्ताक्षर के बाद आता है। मान लें कि हमारे पास एक कक्षा ए है:

 class A : public B { public: A(int a, int b, int c); private: int b_, c_; }; 

फिर, मान लीजिए बी में एक कन्स्ट्रक्टर है जो इंट लेता है, ए के कन्स्ट्रक्टर इस तरह दिख सकता है:

 A::A(int a, int b, int c) : B(a), b_(b), c_(c) // initialization list { // do something } 

जैसा कि आप देख सकते हैं, आधार वर्ग के निर्माता को प्रारंभिक सूची में बुलाया जाता है। प्रारंभिक सूची में डेटा के सदस्यों को शुरू करने से, वैसे, कंसल्टेंट के शरीर के अंदर बी_ और सी_ के लिए मान निर्दिष्ट करने के लिए बेहतर है, क्योंकि आप असाइनमेंट की अतिरिक्त लागत बचत कर रहे हैं।

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

एक अभिभावक निर्माता के मानों को पारित करने का एकमात्र तरीका प्रारंभिक सूची के माध्यम से है। निष्क्रियता सूची एक के साथ कार्यान्वित की गई है: और उसके बाद कक्षाओं और मूल्यों की एक सूची उस क्लास कन्स्ट्रक्टर को दी जाएगी।

 Class2::Class2(string id) : Class1(id) { .... } 

यह भी याद रखें कि अगर आपके पास एक निर्माता है जो पैरेंट क्लास पर कोई मापदंड नहीं लेता है, तो इसे अपने आप से पहले बाल कन्स्ट्रक्टर निष्पादित करने के लिए कहा जाएगा।

यदि आपके पास तर्क के बिना एक निर्माता है, तो इसे व्युत्पन्न क्लास कन्स्ट्रक्टर को निष्पादित करने से पहले कहा जाएगा।

यदि आप बेस-कन्स्ट्रक्टर को तर्क के साथ कॉल करना चाहते हैं तो आपको इसे स्पष्ट रूप से लिखना होगा जैसे कि इस तरह से व्युत्पन्न कन्स्ट्रक्टर में:

 class base { public: base (int arg) { } }; class derived : public base { public: derived () : base (number) { } }; 

आप सी ++ में माता-पिता के निर्माता को कॉल किए बिना व्युत्पन्न वर्ग का निर्माण नहीं कर सकते। या तो यह स्वतः ही होता है यदि यह गैर-आरजीआर सीटोर है, तो ऐसा होता है यदि आप ऊपर दिखाए गए अनुसार सीधे व्युत्पन्न कन्स्ट्रक्टर को कॉल करते हैं या आपका कोड संकलन नहीं करेगा।

प्रत्येक व्यक्ति ने एक प्रारंभिक सूची के माध्यम से एक कंसट्रक्टर कॉल का उल्लेख किया, लेकिन कोई भी नहीं कहा कि एक अभिभावक वर्ग के निर्माता को स्पष्ट रूप से व्युत्पन्न सदस्य के निर्माता के शरीर से कहा जा सकता है। उदाहरण के लिए, उप-वर्ग के कंस्ट्रक्टर बॉडी से बेस क्लास के कन्स्ट्रक्टर को कॉल करने वाले प्रश्न देखें। मुद्दा यह है कि यदि आप किसी व्युत्पन्न वर्ग के शरीर में एक अभिभावक वर्ग या सुपर क्लास कन्स्ट्रक्टर के लिए एक स्पष्ट कॉल का उपयोग करते हैं, तो यह वास्तव में केवल मूल वर्ग का एक उदाहरण बना रहा है और यह व्युत्पन्न ऑब्जेक्ट पर अभिभावक वर्ग के निर्माता को लागू नहीं कर रहा है । व्युत्पन्न क्लास के ऑब्जेक्ट पर पैरेंट क्लास या सुपर क्लास कन्स्ट्रक्टर का इस्तेमाल करने का एकमात्र तरीका प्रारंभिक सूची के माध्यम से नहीं है, व्युत्पन्न क्लास कन्स्ट्रक्टर बॉडी में। इसलिए संभवतः इसे "सुपरक्लास कंस्ट्रक्टर कॉल" नहीं कहा जाना चाहिए मैंने इस उत्तर को यहाँ रखा है क्योंकि किसी को भ्रमित हो सकता है (जैसा मैंने किया था)।

यदि आपके बेस कन्स्ट्रक्टर में आपके डिफ़ॉल्ट पैरामीटर हैं, तो बेस क्लास को स्वचालित रूप से कहा जाएगा।

 using namespace std; class Base { public: Base(int a=1) : _a(a) {} protected: int _a; }; class Derived : public Base { public: Derived() {} void printit() { cout << _a << endl; } }; int main() { Derived d; d.printit(); return 0; } 

आउटपुट है: 1

 CDerived::CDerived() : CBase(...), iCount(0) //this is the initialisation list. You can initialise member variables here too. (eg iCount := 0) { //construct body } 

जब कोई वर्ग एकाधिक वर्गों से प्राप्त होता है, तो किसी ने रचनाकार कॉल के क्रम का उल्लेख नहीं किया। कक्षाओं को प्राप्त करते समय अनुक्रम का उल्लेख किया गया है।