हमने हाल ही में अपने ईईसीएस वर्ग में इस विषय पर काम किया। यदि आप व्याख्यान के नोट्स को विस्तार से देखना चाहते हैं, तो http://umich.edu/~eecs381/lecture/IdiomsDesPattsCreational.pdf पर जाएँ
दो तरीके हैं जो मैं एक सिंगलटन क्लास को सही तरीके से बनाना जानता हूं।
पहला तरीका:
इसे उसी तरह से लागू करें जिस तरह से आपके पास इसका उदाहरण है। विनाश के लिए के रूप में, "सिंगलेट्स आमतौर पर कार्यक्रम चलाने की अवधि के लिए सहन करते हैं; अधिकांश ओएस स्मृति को पुनर्प्राप्त करेंगे और जब कोई कार्यक्रम समाप्त होता है तो अधिकांश अन्य संसाधन, इसलिए इस बारे में चिंता न करने का एक तर्क है।"
हालांकि, कार्यक्रम समाप्ति पर सफाई करना अच्छा है। इसलिए, आप इसे एक सहायक स्टेटिक सिंगलटनडिस्ट्रक्टर वर्ग के साथ कर सकते हैं और घोषणा कर सकते हैं कि आपके सिंगलटन में एक दोस्त के रूप में।
class Singleton {
public:
static Singleton* get_instance();
// disable copy/move -- this is a Singleton
Singleton(const Singleton&) = delete;
Singleton(Singleton&&) = delete;
Singleton& operator=(const Singleton&) = delete;
Singleton& operator=(Singleton&&) = delete;
friend class Singleton_destroyer;
private:
Singleton(); // no one else can create one
~Singleton(); // prevent accidental deletion
static Singleton* ptr;
};
// auxiliary static object for destroying the memory of Singleton
class Singleton_destroyer {
public:
~Singleton_destroyer { delete Singleton::ptr; }
};
Singleton_destroyer प्रोग्राम स्टार्टअप पर बनाया जाएगा, और "जब प्रोग्राम समाप्त हो जाता है, रनटाइम लाइब्रेरी शटडाउन कोड (लिंकर द्वारा सम्मिलित) द्वारा सभी वैश्विक / स्थैतिक ऑब्जेक्ट नष्ट हो जाते हैं, तो the_destroyer नष्ट हो जाएगा; इसका विध्वंसक सिंग्लटन को हटा देगा, इसे चलाने वाला नाशक। "
दूसरा तरीका
यह Meyers Singleton कहा जाता है, जिसे C ++ विज़ार्ड स्कॉट मेयर्स द्वारा बनाया गया है। बस get_instance () को अलग तरीके से परिभाषित करें। अब आप पॉइंटर मेंबर वेरिएबल से भी छुटकारा पा सकते हैं।
// public member function
static Singleton& Singleton::get_instance()
{
static Singleton s;
return s;
}
यह साफ-सुथरा है क्योंकि लौटाया गया मूल्य संदर्भ से है और आप सदस्य चर का उपयोग करने के .
बजाय सिंटैक्स का उपयोग कर सकते हैं ->
।
"कंपाइलर स्वचालित रूप से कोड बनाता है जो घोषणा के माध्यम से पहली बार बनाता है, उसके बाद नहीं, और फिर प्रोग्राम समाप्ति पर स्थिर ऑब्जेक्ट को हटा देता है।"
यह भी ध्यान दें कि मेयर्स सिंगलटन के साथ आप "बहुत मुश्किल स्थिति में आ सकते हैं यदि ऑब्जेक्ट समाप्ति के समय एक दूसरे पर भरोसा करते हैं - सिंग्लटन कब अन्य वस्तुओं के सापेक्ष गायब हो जाता है? लेकिन सरल अनुप्रयोगों के लिए, यह ठीक काम करता है।"