आज मेरे एक दोस्त ने मुझसे पूछा कि वह वैश्विक स्थिर वस्तु पर सिंगलटन का उपयोग क्यों करना चाहिए? जिस तरह से मैंने इसे समझाया था, यह था कि सिंगलटन में राज्य बनाम स्थैतिक वैश्विक वस्तु नहीं होगी ... लेकिन फिर मुझे यकीन नहीं था .. क्योंकि यह सी ++ में है .. (मैं सी # से आ रहा था)
एक स्थिर वैश्विक वस्तु के रूप में अच्छी तरह से सी # में राज्य हो सकता है:
class myclass {
// can have state
// ...
public static myclass m = new myclass(); // globally accessible static instance, which can have state
}
क्या फायदे एक दूसरे के ऊपर कर रहे हैं? (सी ++ में)
एक सिंगलटन आपके कोड को अपंग करता है, एक वैश्विक स्थिर उदाहरण नहीं है। अकेले सिंगलेट्स की समस्याओं के बारे में SO पर अनगिनत प्रश्न हैं। Here's one, and another, or another।
यदि हम केवल पहले बिंदु चाहते हैं, तो हमें एक वैश्विक रूप से सुलभ वस्तु बनाना चाहिए। और क्यों हम कभी दूसरा चाहते हैं? हम को पहले से जानते हैं कि भविष्य में हमारे कोड का उपयोग कैसे किया जा सकता है, तो इसे क्यों नकारें और उपयोगी कार्यक्षमता को हटा दें? हम आमतौर पर गलत होते हैं जब हम भविष्यवाणी करते हैं कि "मुझे केवल एक उदाहरण की आवश्यकता होगी"। और "मुझे केवल एक उदाहरण की आवश्यकता होगी" के बीच एक बड़ा अंतर है (सही जवाब एक उदाहरण बनाते हैं), और "यदि एक से अधिक उदाहरण बनाए गए हैं तो एप्लिकेशन किसी भी परिस्थिति में सही ढंग से नहीं चल सकता है। क्रैश, उपयोगकर्ता के हार्डड्राइव को प्रारूपित करें और इंटरनेट पर संवेदनशील डेटा प्रकाशित करें "(यहां जवाब है: संभव है कि आपका ऐप टूटा हुआ हो, लेकिन यदि यह नहीं है, तो हाँ, एक सिंगलटन आपको चाहिए)
और फिर आप जटिल दौड़ की स्थिति पेश करते हैं और थ्रेड सुरक्षा को फेंक देते हैं क्योंकि दो धागे एक साथ उस समारोह को कॉल कर सकते हैं। – jalf
एक सादा पुरानी वैश्विक वस्तु होने के बावजूद, पर्याप्त रूप से पर्याप्त, std :: cout looks ठीक काम करने के लिए ... मुझे यकीन है कि प्रारंभिकरण का आदेश इतनी बड़ी समस्या थी, मानक समिति अब तक ध्यान देगी।यदि आप ग्लोबल्स का उपयोग करते हैं और उन्हें एक-दूसरे पर निर्भर करते हैं तो यह केवल एक समस्या है। – jalf
@jalf: अपना होमवर्क करें। 'cout' और' cin' को मानक द्वारा 'मुख्य() 'से पहले विशेष रूप से निर्दिष्ट करने के लिए निर्दिष्ट किया गया है। अन्य वैश्विक वस्तुओं को यह उपचार नहीं मिलता है। इसके अलावा, थ्रेड-सुरक्षित सिंगलटन कार्यान्वयन मौजूद हैं और खुद को लिखना मुश्किल नहीं है; डबल-निर्माण को रोकने के लिए आपको केवल डबल-लॉक की आवश्यकता है। व्यक्तिगत रूप से मैं सिंगलेट से बचने की कोशिश करता हूं, मुझे लगता है कि पैटर्न का उपयोग अधिक हो गया है। लेकिन सी ++ ज्ञान की आपकी कमी मुझे कम करने का कोई कारण नहीं है। – rlbond