Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> 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 *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() {
         ^

  1. मैं अपनी कस्टम वस्तुओं को सीरियल करने योग्य कैसे बना सकता हूं?

    यह उदाहरण दिखाता है कि मैं अपने कस्टम ऑब्जेक्ट्स को सीरियल करने योग्य कैसे बना सकता हूं चरण 1 - एंड्रॉइड स्टूडियो में एक नया प्रोजेक्ट बनाएं, फाइल ⇒ न्यू प्रोजेक्ट पर जाएं और एक नया प्रोजेक्ट बनाने के लिए सभी आवश्यक विवरण भरें। चरण 2 - निम्न कोड को res/layout/activity_main.xml में जोड़ें। उपरोक

  1. मैं अपनी कस्टम वस्तुओं को पार्सल करने योग्य कैसे बना सकता हूं?

    यह उदाहरण दर्शाता है कि मैं अपनी कस्टम वस्तुओं को पार्सल करने योग्य कैसे बना सकता हूं चरण 1 - एंड्रॉइड स्टूडियो में एक नया प्रोजेक्ट बनाएं, फाइल ⇒ न्यू प्रोजेक्ट पर जाएं और एक नया प्रोजेक्ट बनाने के लिए सभी आवश्यक विवरण भरें। चरण 2 - निम्न कोड को res/layout/activity_main.xml में जोड़ें। उपरोक्त

  1. हम JTextField को जावा में केवल संख्याएँ कैसे स्वीकार कर सकते हैं?

    डिफ़ॉल्ट रूप से, एक JTextField संख्याओं की अनुमति दे सकते हैं , अक्षर , और विशेष अक्षर . JTextField . में टाइप किए गए उपयोगकर्ता इनपुट को मान्य करना मुश्किल हो सकता है, खासकर अगर इनपुट स्ट्रिंग को एक संख्यात्मक मान जैसे कि एक int में परिवर्तित किया जाना चाहिए। नीचे दिए गए उदाहरण में, JTextField