2011-09-30 11 views
5

मैं स्मार्ट पॉइंटर्स के साथ "तीन नियम" का उपयोग कर थोड़ा उलझन में हूं। अगर मेरे पास एक वर्ग है जिसका एकमात्र डेटा सदस्य स्मार्ट पॉइंटर है, तो क्या मुझे विनाशक, कॉपी कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर को स्पष्ट रूप से परिभाषित करने की आवश्यकता है?स्मार्ट पॉइंटर के साथ तीन का नियम?

मेरी समझ यह है कि चूंकि स्मार्ट पॉइंटर स्वचालित रूप से संसाधन को संभाल लेगा, इसलिए मुझे विनाशक को स्पष्ट रूप से परिभाषित करने की आवश्यकता नहीं है, और इस प्रकार मुझे तीनों के नियम के आधार पर अन्य दो के लिए ऐसा करने की आवश्यकता नहीं है। हालांकि, मुझे यकीन नहीं है कि डिफ़ॉल्ट प्रतिलिपि निर्माता स्मार्ट पॉइंटर्स जैसे shared_ptr के लिए पर्याप्त है।

आपकी मदद के लिए धन्यवाद!

+0

EXP0, आप बेहतर ढंग से स्पष्ट करते हैं कि आप किस प्रकार का स्मार्ट पॉइंटर उपयोग करते हैं। क्या यह std :: auto_ptr, या boost :: shared_ptr <> जैसा कुछ है? – Lev

उत्तर

10

डिफ़ॉल्ट विनाशक ठीक है, क्योंकि shared_ptr का विनाशक वस्तु के विघटन का ख्याल रखेगा। डिफ़ॉल्ट प्रतिलिपि निर्माता आपके उद्देश्यों के आधार पर स्वीकार्य हो सकता है: जब आप shared_ptr के ऑब्जेक्ट की प्रतिलिपि बनाते हैं, तो प्रति मूल के साथ स्वामित्व साझा करेगी। यह स्वाभाविक रूप से डिफ़ॉल्ट असाइनमेंट ऑपरेटर के बारे में सच होगा। यदि वह नहीं है जो आप चाहते हैं, तो एक कॉपी कन्स्ट्रक्टर को परिभाषित करें जो अन्यथा उदाहरण के लिए, संदर्भित ऑब्जेक्ट क्लोन करता है।

+1

आप असाइनमेंट ऑपरेटर को ओवरराइड करना भी चाह सकते हैं।ले जाएं निर्माण/चाल असाइन ठीक होना चाहिए –

1

तीन के नियम वास्तव में कहते हैं:

  1. नाशक
  2. असाइनमेंट ऑपरेटर
  3. कॉपी कंस्ट्रक्टर:

    आप निम्न में से किसी की एक गैर तुच्छ संस्करण को परिभाषित करने की जरूरत है

... तो आप शायद नी अन्य दो भी साथ।

आप एक गैर तुच्छ नाशक की जरूरत है तो आप भी अन्य दो की जरूरत है:

आप के रूप में यह व्याख्या कर रहे हैं।

लेकिन यह वही बात नहीं है, है ना?

2

संक्षेप में, "नहीं"। एकल जिम्मेदारी वर्गों में फैक्टरिंग कोड का पूरा बिंदु यह है कि आप अपने वर्गों को "स्मार्ट" बिल्डिंग ब्लॉक से लिख सकते हैं ताकि आपको कोई भी कोड लिखने की आवश्यकता न हो।

class Foo 
{ 
    std::shared_ptr<Bar> m_pbar; 
    std::string   m_id; 
}; 

इस वर्ग के लिए स्वचालित रूप से कॉपी और चाल निर्माणकर्ता और कॉपी और असाइनमेंट ऑपरेटरों कि के रूप में अच्छा के रूप में वे प्राप्त कर सकते हैं के लिए कदम है, और सब कुछ का ख्याल रखा जाता है:

निम्नलिखित पर विचार करें।

आप चरम होना चाहते हैं, तो आप कह सकते हैं कि सबसे मामलों में आप शायद कभी नहीं एक नाशक लेखन किया जाना चाहिए या सभी पर निर्माता कॉपी - और अगर आप ऐसा करेंगे, तो शायद आपको भी करना चाहिए सबसे अच्छा पहलू यह है कि कार्यक्षमता एक ही जिम्मेदारी के साथ एक अलग वर्ग में।

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