2009-06-29 17 views
56

कोई भी कन्स्ट्रक्टर सुरक्षित क्यों घोषित करेगा? मुझे पता है कि रचनाकारों को अपनी रचना को ढेर पर जाने की अनुमति न देने के उद्देश्य से निजी घोषित किया जाता है।संरक्षित कन्स्ट्रक्टर के व्यावहारिक उपयोग क्या हैं?

उत्तर

73

जब कोई वर्ग एक सार वर्ग (इरादा) के रूप में लक्षित होता है, तो संरक्षित कन्स्ट्रक्टर बिल्कुल सही होता है। उस स्थिति में आप नहीं चाहते हैं कि कक्षाएं कक्षा से तत्काल हो जाएं लेकिन केवल इसका उपयोग करने के लिए इसका उपयोग करें।

अन्य उपयोग मामले हैं, जैसे कि निर्माण पैरामीटर का एक निश्चित सेट व्युत्पन्न कक्षाओं तक सीमित होना चाहिए।

+7

+1 लेकिन जरूरी नहीं कि एक अमूर्त वर्ग होना आवश्यक है। हालांकि यह अक्सर मामला है। – ralphtheninja

+4

क्या आधार वर्ग को परिभाषित करने के लिए एक कार्य को शुद्ध वर्चुअल घोषित करने के लिए पर्याप्त नहीं है? या उपर्युक्त शुद्ध वर्चुअल फ़ंक्शन की अनुपस्थिति में है। इस तरह के एक सार वर्ग के व्युत्पन्न वर्ग के लिए एक निर्माण घटना क्या है? –

+0

@ हेनक होल्टरमैन यह निश्चित रूप से करता है - सी ++ मानक की धारा 10.4 देखें, जिसका शीर्षक है "सार कक्षाएं" –

11

एक का उपयोग कारखाना पैटर्न

6

एक संरक्षित निर्माता मतलब यह है कि केवल व्युत्पन्न सदस्यों वर्ग (और व्युत्पन्न उदाहरण) के उदाहरण का निर्माण कर सकते है कि निर्माता का उपयोग कर हो सकता है। यह थोड़ा चिकन-अंडे लगता है, लेकिन कभी-कभी कक्षा कारखानों को लागू करते समय उपयोगी होता है।

+3

तकनीकी रूप से, यह केवल तभी लागू होता है जब सभी ctors संरक्षित हों। – MSalters

+1

दोस्त कक्षाएं संरक्षित कन्स्ट्रक्टर को भी कॉल कर सकती हैं (न केवल कक्षाएं प्राप्त की गईं)। –

+0

...और संरक्षित कन्स्ट्रक्टर को बुलाते हुए एक मित्र वर्ग का उपयोग उस ऑब्जेक्ट के मामले में होगा जिसमें निरंतर सदस्य हैं (कन्स्ट्रक्टर द्वारा निर्धारित) लेकिन सार्वजनिक होने की आवश्यकता है, लेकिन किसी अन्य सार्वजनिक पहुंच द्वारा कभी भी सेट नहीं किया जाना चाहिए, गारंटी देता है कि ऑब्जेक्ट कहीं और नहीं बनाया जाएगा और इसलिए डेटा कहीं और संशोधित नहीं किया जाएगा। – osirisgothra

3

एक सबक्लस एक ऐसे कन्स्ट्रक्टर का उपयोग करने के लिए जो तुरंत तत्काल के लिए सुलभ नहीं होना चाहिए।

3

उदाहरण के लिए आप वर्गों है कि यह बना सकते हैं सीमित करने के लिए, यह इस्तेमाल कर सकते हैं: तो आप स्तर जानते हैं कि हमेशा जाएगा

class Level 
{ 
private: 

Level(); 
¨Level(); 

friend class LevelManager; 
}; 

केवल वर्ग है कि यह का एक उदाहरण बना सकते हैं, LevelManager वर्ग है उदाहरण LevelManager में बनाया गया है।

+0

सच है, यह एक निजी निर्माता है, संरक्षित नहीं है। – David

+0

आह क्षमा करें, मैंने गलत पढ़ा है। क्या मैं अपनी पोस्ट हटा दूंगा? –

7

गैर-सार्वजनिक निर्माता उपयोगी होते हैं जब निर्माण आवश्यकताओं को पूरी तरह से निर्माता द्वारा गारंटी नहीं दी जा सकती है। उदाहरण के लिए, यदि किसी प्रारंभिक विधि को कन्स्ट्रक्टर के ठीक बाद कॉल करने की आवश्यकता है, या यदि वस्तु को कुछ कंटेनर/प्रबंधक ऑब्जेक्ट के साथ स्वयं पंजीकृत करने की आवश्यकता है, तो यह कन्स्ट्रक्टर के बाहर किया जाना चाहिए। कन्स्ट्रक्टर तक पहुंच सीमित करके और केवल एक फैक्ट्री विधि प्रदान करके, आप यह सुनिश्चित कर सकते हैं कि उपयोगकर्ता द्वारा प्राप्त किए गए किसी भी उदाहरण से इसकी सभी गारंटी पूरी हो जाएगी। इसका उपयोग आमतौर पर सिंगलटन को लागू करने के लिए भी किया जाता है, जो वर्ग की वास्तव में एक और गारंटी है (कि केवल एक ही उदाहरण होगा)।

निजी के बजाए कन्स्ट्रक्टर संरक्षित करने का कारण निजी है, किसी अन्य विधि या क्षेत्र को निजी के बजाय संरक्षित करने के लिए समान है: ताकि इसे बच्चों द्वारा विरासत में प्राप्त किया जा सके। शायद आप बेस क्लास में सार्वजनिक, गैर वर्चुअल फैक्ट्री विधि चाहते हैं, जो व्युत्पन्न कक्षाओं के उदाहरणों के संदर्भ देता है; व्युत्पन्न वर्ग स्पष्ट रूप से अभिभावक रचनाकारों तक पहुंच चाहते हैं, लेकिन आप अभी भी उन्हें अपने कारखाने के बाहर बनाना नहीं चाहते हैं।

2

साइड इफेक्ट्स के साथ फैक्ट्री विधियों के लिए।

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; } 

}; 

यह कक्षा के उदाहरण बनाता है और गारंटी देता है कि उनमें से प्रत्येक में एक अद्वितीय वृद्धिशील पूर्णांक आईडी है। ध्यान दें कि यदि आप जिस कंस्ट्रक्टर का उपयोग करना चाहते हैं वह डिफ़ॉल्ट नहीं है, तो आपको डिफ़ॉल्ट भी छिपाना होगा।

5

एक संरक्षित कन्स्ट्रक्टर का उपयोग कक्षा को प्रभावी ढंग से सार बनाने के लिए किया जा सकता है जब इसकी कोई भी विधि शुद्ध-आभासी नहीं होती है।

यह सी ++ भावना में काफी सार नहीं है क्योंकि मित्र वर्ग अभी भी ओवरराइड किए बिना इसका उपयोग कर सकते हैं, लेकिन फिर आपको इन्हें घोषित करना होगा।

संबंधित मुद्दे