कोई भी कन्स्ट्रक्टर सुरक्षित क्यों घोषित करेगा? मुझे पता है कि रचनाकारों को अपनी रचना को ढेर पर जाने की अनुमति न देने के उद्देश्य से निजी घोषित किया जाता है।संरक्षित कन्स्ट्रक्टर के व्यावहारिक उपयोग क्या हैं?
उत्तर
जब कोई वर्ग एक सार वर्ग (इरादा) के रूप में लक्षित होता है, तो संरक्षित कन्स्ट्रक्टर बिल्कुल सही होता है। उस स्थिति में आप नहीं चाहते हैं कि कक्षाएं कक्षा से तत्काल हो जाएं लेकिन केवल इसका उपयोग करने के लिए इसका उपयोग करें।
अन्य उपयोग मामले हैं, जैसे कि निर्माण पैरामीटर का एक निश्चित सेट व्युत्पन्न कक्षाओं तक सीमित होना चाहिए।
एक का उपयोग कारखाना पैटर्न
एक संरक्षित निर्माता मतलब यह है कि केवल व्युत्पन्न सदस्यों वर्ग (और व्युत्पन्न उदाहरण) के उदाहरण का निर्माण कर सकते है कि निर्माता का उपयोग कर हो सकता है। यह थोड़ा चिकन-अंडे लगता है, लेकिन कभी-कभी कक्षा कारखानों को लागू करते समय उपयोगी होता है।
तकनीकी रूप से, यह केवल तभी लागू होता है जब सभी ctors संरक्षित हों। – MSalters
दोस्त कक्षाएं संरक्षित कन्स्ट्रक्टर को भी कॉल कर सकती हैं (न केवल कक्षाएं प्राप्त की गईं)। –
...और संरक्षित कन्स्ट्रक्टर को बुलाते हुए एक मित्र वर्ग का उपयोग उस ऑब्जेक्ट के मामले में होगा जिसमें निरंतर सदस्य हैं (कन्स्ट्रक्टर द्वारा निर्धारित) लेकिन सार्वजनिक होने की आवश्यकता है, लेकिन किसी अन्य सार्वजनिक पहुंच द्वारा कभी भी सेट नहीं किया जाना चाहिए, गारंटी देता है कि ऑब्जेक्ट कहीं और नहीं बनाया जाएगा और इसलिए डेटा कहीं और संशोधित नहीं किया जाएगा। – osirisgothra
एक सबक्लस एक ऐसे कन्स्ट्रक्टर का उपयोग करने के लिए जो तुरंत तत्काल के लिए सुलभ नहीं होना चाहिए।
उदाहरण के लिए आप वर्गों है कि यह बना सकते हैं सीमित करने के लिए, यह इस्तेमाल कर सकते हैं: तो आप स्तर जानते हैं कि हमेशा जाएगा
class Level
{
private:
Level();
¨Level();
friend class LevelManager;
};
केवल वर्ग है कि यह का एक उदाहरण बना सकते हैं, LevelManager वर्ग है उदाहरण LevelManager में बनाया गया है।
सच है, यह एक निजी निर्माता है, संरक्षित नहीं है। – David
आह क्षमा करें, मैंने गलत पढ़ा है। क्या मैं अपनी पोस्ट हटा दूंगा? –
गैर-सार्वजनिक निर्माता उपयोगी होते हैं जब निर्माण आवश्यकताओं को पूरी तरह से निर्माता द्वारा गारंटी नहीं दी जा सकती है। उदाहरण के लिए, यदि किसी प्रारंभिक विधि को कन्स्ट्रक्टर के ठीक बाद कॉल करने की आवश्यकता है, या यदि वस्तु को कुछ कंटेनर/प्रबंधक ऑब्जेक्ट के साथ स्वयं पंजीकृत करने की आवश्यकता है, तो यह कन्स्ट्रक्टर के बाहर किया जाना चाहिए। कन्स्ट्रक्टर तक पहुंच सीमित करके और केवल एक फैक्ट्री विधि प्रदान करके, आप यह सुनिश्चित कर सकते हैं कि उपयोगकर्ता द्वारा प्राप्त किए गए किसी भी उदाहरण से इसकी सभी गारंटी पूरी हो जाएगी। इसका उपयोग आमतौर पर सिंगलटन को लागू करने के लिए भी किया जाता है, जो वर्ग की वास्तव में एक और गारंटी है (कि केवल एक ही उदाहरण होगा)।
निजी के बजाए कन्स्ट्रक्टर संरक्षित करने का कारण निजी है, किसी अन्य विधि या क्षेत्र को निजी के बजाय संरक्षित करने के लिए समान है: ताकि इसे बच्चों द्वारा विरासत में प्राप्त किया जा सके। शायद आप बेस क्लास में सार्वजनिक, गैर वर्चुअल फैक्ट्री विधि चाहते हैं, जो व्युत्पन्न कक्षाओं के उदाहरणों के संदर्भ देता है; व्युत्पन्न वर्ग स्पष्ट रूप से अभिभावक रचनाकारों तक पहुंच चाहते हैं, लेकिन आप अभी भी उन्हें अपने कारखाने के बाहर बनाना नहीं चाहते हैं।
साइड इफेक्ट्स के साथ फैक्ट्री विधियों के लिए।
class mine {
private:
mine() {};
protected:
mine(int id) : m_id(id) {};
int m_id;
static int m_count;
public:
static mine* CreateOneOfMe() {
return mine(m_count++);
}
int GetId() { return m_id; }
};
यह कक्षा के उदाहरण बनाता है और गारंटी देता है कि उनमें से प्रत्येक में एक अद्वितीय वृद्धिशील पूर्णांक आईडी है। ध्यान दें कि यदि आप जिस कंस्ट्रक्टर का उपयोग करना चाहते हैं वह डिफ़ॉल्ट नहीं है, तो आपको डिफ़ॉल्ट भी छिपाना होगा।
एक संरक्षित कन्स्ट्रक्टर का उपयोग कक्षा को प्रभावी ढंग से सार बनाने के लिए किया जा सकता है जब इसकी कोई भी विधि शुद्ध-आभासी नहीं होती है।
यह सी ++ भावना में काफी सार नहीं है क्योंकि मित्र वर्ग अभी भी ओवरराइड किए बिना इसका उपयोग कर सकते हैं, लेकिन फिर आपको इन्हें घोषित करना होगा।
- 1. जावास्क्रिप्ट प्रोटोटाइप ऑब्जेक्ट्स के व्यावहारिक उपयोग के मामले क्या हैं?
- 2. SQLite: व्यावहारिक सीमाएं क्या हैं?
- 3. करी के व्यावहारिक फायदे क्या हैं?
- 4. प्रोग्रामिंग में मॉड्यूलस (%) के व्यावहारिक उपयोग क्या हैं?
- 5. फैक्टरी विधि पैटर्न के व्यावहारिक उपयोग क्या हैं?
- 6. मुलायम संदर्भों का उपयोग करने के "व्यावहारिक परिणाम" क्या हैं?
- 7. व्यावहारिक उपयोग
- 8. Dispatcher.DisableProcessing के लिए व्यावहारिक उपयोग?
- 9. क्या बिटवाई ऑपरेशंस अभी भी व्यावहारिक हैं?
- 10. संरक्षित कन्स्ट्रक्टर बनाम शुद्ध आभासी विनाशक
- 11. मेथडेंटल क्लास के व्यावहारिक उपयोग?
- 12. गतिशील_कास्ट का व्यावहारिक उपयोग?
- 13. सिस्टम का व्यावहारिक उपयोग क्या है। लेनदेन?
- 14. आरओटी 13 एल्गोरिदम के कुछ व्यावहारिक अनुप्रयोग क्या हैं?
- 15. सबसे कम आम पूर्वज एल्गोरिदम के व्यावहारिक अनुप्रयोग क्या हैं?
- 16. बूस्ट :: एमपीएल के व्यावहारिक उपयोग के उदाहरण?
- 17. संरचनात्मक प्रकार के लिए व्यावहारिक उपयोग?
- 18. jQuery.map - फ़ंक्शन के लिए व्यावहारिक उपयोग?
- 19. तीन आयामी matrices: व्यावहारिक उपयोग
- 20. अभिव्यक्ति पेड़ों का व्यावहारिक उपयोग
- 21. `stackalloc` कीवर्ड का व्यावहारिक उपयोग
- 22. असेंबली के साथ व्यावहारिक सीमाएं सीएलएस के अनुरूप नहीं हैं?
- 23. PHP की नींद() के लिए व्यावहारिक उपयोग क्या है?
- 24. विभिन्न डेटा संरचनाओं के व्यावहारिक उपयोग
- 25. इंटरफ़ेस ईवेंट का व्यावहारिक उपयोग
- 26. LockSupport और AbstractQueuedSynchronizer का कोई व्यावहारिक उदाहरण उपयोग करते हैं?
- 27. तीन या अधिक आयाम वाले सरणी के लिए कुछ रोचक/व्यावहारिक उपयोग क्या हैं?
- 28. सी में कॉन्स्ट-क्वालिफाइड चर के लिए कुछ व्यावहारिक उपयोग क्या हैं?
- 29. प्रति सीपीयू धागे की व्यावहारिक सीमा क्या हैं?
- 30. क्या संरक्षित विनाशक वर्चुअल बनाने के लिए कोई उपयोग है?
+1 लेकिन जरूरी नहीं कि एक अमूर्त वर्ग होना आवश्यक है। हालांकि यह अक्सर मामला है। – ralphtheninja
क्या आधार वर्ग को परिभाषित करने के लिए एक कार्य को शुद्ध वर्चुअल घोषित करने के लिए पर्याप्त नहीं है? या उपर्युक्त शुद्ध वर्चुअल फ़ंक्शन की अनुपस्थिति में है। इस तरह के एक सार वर्ग के व्युत्पन्न वर्ग के लिए एक निर्माण घटना क्या है? –
@ हेनक होल्टरमैन यह निश्चित रूप से करता है - सी ++ मानक की धारा 10.4 देखें, जिसका शीर्षक है "सार कक्षाएं" –