2009-12-04 15 views
10

पारंपरिक रूप से, सी ++ में, आप कन्स्ट्रक्टर में कोई निर्भरता बनाएंगे और उन्हें विनाशक में हटा देंगे।कन्स्ट्रक्टर में बनाने के लिए पैटर्न का नाम, विनाशक (सी ++)

class A 
{ 
public: 
    A() { m_b = new B(); } 
    ~A() { delete m_b; } 
private: 
    B* m_b; 
}; 

संसाधन अधिग्रहण की यह तकनीक/पैटर्न, क्या इसका एक आम नाम है?
मुझे पूरा यकीन है कि मैंने इसे कहीं पढ़ा है लेकिन अब इसे नहीं मिला।

संपादित करें:
जैसा कि कई ने इंगित किया है, यह वर्ग अपूर्ण है और वास्तव में एक प्रतिलिपि निर्माता और असाइनमेंट ऑपरेटर को कार्यान्वित करना चाहिए।
मूल रूप से, मैंने जानबूझकर इसे छोड़ दिया क्योंकि यह वास्तविक प्रश्न के लिए प्रासंगिक नहीं था: पैटर्न का नाम। हालांकि, पूर्णता के लिए और अच्छे प्रथाओं को प्रोत्साहित करने के लिए, स्वीकृत उत्तर यह है कि यह क्या है।

+5

खराब वर्ग ए कॉपी कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर गायब हैं। –

+1

यदि कॉपी/असाइनमेंट की आवश्यकता नहीं है तो एक आसान समाधान बूस्ट :: noncopyable से प्राप्त करना है। आपको उन दो कार्यों को परिभाषित करने के लिए बचाता है। (और यह सुनिश्चित करता है कि उन्हें गलती से बुलाया नहीं गया है) – jalf

उत्तर

14

अपने प्रश्न का उत्तर आरए II है (संसाधन अधिग्रहण है प्रारंभ) है।

लेकिन अपने उदाहरण खतरनाक है:

समाधान 1 उपयोग एक स्मार्ट सूचक:

class A 
{ 
    public: 
    A(): m_b(new B) {} 
    private: 
    boost::shared_ptr<B> m_b; 
}; 

समाधान 2: 4 के नियम याद रखें:
अपनी कक्षा एक "स्वामित्व रॉ सूचक" तो शामिल हैं आपको सभी कंपाइलर जेनरेट किए गए तरीकों को ओवरराइड करने की आवश्यकता है।

class A 
{ 
    public: 
    A():    m_b(new B)   {} 
    A(A const& copy): m_b(new B(copy.m_b)) {} 
    A& operator=(A const& copy) 
    { 
     A tmp(copy); 
     swap(tmp); 
     return *this; 
    } 
    ~A() 
    { 
     delete m_b; 
    } 
    void swap(A& dst) throw() 
    { 
     using std::swap; 
     swap(m_b, dst.m_b); 
    } 
    private: 
    B* m_b; 
}; 

मैं ऊपर "स्वामित्व रॉ पॉइंटर" शब्द का उपयोग करता हूं क्योंकि यह सबसे सरल उदाहरण है। लेकिन आरएआईआई सभी संसाधनों पर लागू होता है और जब आपके ऑब्जेक्ट में एक संसाधन होता है जिसे आपको प्रबंधित करने की आवश्यकता होती है ('स्वामित्व वाले रॉय पॉइंटर', डीबी हैंडल इत्यादि)।

+0

उसका उदाहरण क्यों कमजोर है?उन्होंने संकलक –

+5

पर कन्स्ट्रक्टर जेनरेट कॉपी कन्स्ट्रक्टर की वजह से कन्स्ट्रक्टर और डिलोकेट पर आवंटित किया। –

+2

"कच्चे सूचक का मालिक है" शायद "या किसी अन्य प्रकार के संसाधन संभाल" में विस्तारित किया जाना चाहिए। यह फ़ाइल हैंडल, सॉकेट, डेटाबेस कनेक्शन या किसी भी अन्य संसाधन के लिए लागू होता है जिसका जीवनकाल प्रबंधित होना है। – jalf

19

RAII - संसाधन अधिग्रहण प्रारंभ

+1

हालांकि आम तौर पर आप अपने लिए कोड बनाने के बजाय RAII करने के लिए स्मार्ट पॉइंटर का उपयोग करेंगे –

+4

आवश्यक नहीं है। आरएआईआई कक्षा को लिखना आपको संसाधन के लिए आजीवन प्रबंधन पर अधिक बेहतर नियंत्रण देता है। स्मार्ट पॉइंटर्स आरएआईआई के कई संभावित उदाहरणों में से एक हैं। मुहावरे * कवर * से अधिक * बूस्ट :: shared_ptr' – jalf

2

इस तकनीक को RAII के रूप में जाना जाता है - संसाधन आवंटन प्रारंभ है। इस साइट पर इसका अपना tag है।

वैकल्पिक। अधिक सहज नामों का सुझाव दिया गया है, विशेष रूप से:

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