इस समस्या में हम देखेंगे कि हम एक वर्ग कैसे बना सकते हैं जिसके लिए हम केवल गतिशील स्मृति आवंटन के माध्यम से वस्तुओं का निर्माण कर सकते हैं, किसी भी प्रत्यक्ष वस्तु निर्माण की अनुमति नहीं है।
विचार सरल है। हमें उस वर्ग के लिए निजी विनाशक बनाना है। जब विनाशक निजी होता है, तो संकलक गैर-गतिशील रूप से आवंटित वस्तुओं के लिए एक कंपाइलर त्रुटि उत्पन्न करेगा क्योंकि संकलक को उपयोग के लिए उपलब्ध नहीं होने पर उन्हें स्टैक सेगमेंट से हटाने की आवश्यकता होती है। गतिशील रूप से आवंटित वस्तुओं के लिए, प्रोग्रामर वस्तु को हटाने के लिए जिम्मेदार है, लेकिन संकलक उसके लिए जिम्मेदार नहीं है, इसलिए यह गतिशील रूप से वस्तुओं को बनाने की अनुमति देता है।
मेमोरी लीक से बचने के लिए, हम एक फ्रेंड फंक्शन का उपयोग करेंगे, जिसे क्लास के यूजर्स ऑब्जेक्ट को नष्ट करने के लिए कॉल कर सकते हैं।
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#include<iostream> using namespace std; class NoDirectObjClass { private: ~NoDirectObjClass() { cout << "Destroyng NoDirectObjClass object" << endl; } public: NoDirectObjClass() { cout << "Creating object" << endl; } friend void friend_destructor(NoDirectObjClass* ); }; void friend_destructor(NoDirectObjClass* p) { delete p; cout << "Destroyng object using friend" << endl; } int main(){ NoDirectObjClass *p = new NoDirectObjClass; friend_destructor(p); }
आउटपुट
Creating object Destroyng NoDirectObjClass object Destroyng object using friend
यदि हम डायनेमिक मेमोरी आवंटन का उपयोग किए बिना सीधे ऑब्जेक्ट बनाने की कोशिश करते हैं, तो यह निम्नानुसार आउटपुट उत्पन्न करेगा -
उदाहरण (C++)
#include<iostream> using namespace std; class NoDirectObjClass { private: ~NoDirectObjClass() { cout << "Destroyng NoDirectObjClass object" << endl; } public: NoDirectObjClass() { cout << "Creating object" << endl; } friend void friend_destructor(NoDirectObjClass* ); }; void friend_destructor(NoDirectObjClass* p) { delete p; cout << "Destroyng object using friend" << endl; } int main(){ NoDirectObjClass t1; }
आउटपुट
main.cpp: In function ‘int main()’: main.cpp:22:22: error: ‘NoDirectObjClass::~NoDirectObjClass()’ is private within this context NoDirectObjClass t1; ^~ main.cpp:6:9: note: declared private here ~NoDirectObjClass() { ^