2013-02-14 10 views
5
class T 
{}; 

class AccessT 
{ 
public: 
    boost::shared_ptr<const T> getT() const {return m_T;} 
    boost::shared_ptr<T>  getT()  {return m_T;} 

private: 
    boost::shared_ptr<T> m_T; 
}; 

प्रश्न> मैंने विरासत परियोजना में उपर्युक्त समान कोड देखे हैं। मैं वास्तव में ऐसा करने के बिंदु को समझ नहीं पा रहा हूं। क्यों नहीं बस के बजाय निम्न प्रदान करें:दो फ़ंक्शन प्रदान करें

class T 
{}; 

class AccessTModified 
{ 
public: 
    boost::shared_ptr<T> getT() const { return m_T; } 

private: 
    boost::shared_ptr<T> m_T; 
}; 

प्रारंभिक तर्क हो सकता है boost::shared_ptr<const T> getT() const स्थिरांक वस्तु दुर्घटना से टी को संशोधित नहीं कर सकते हैं। यदि ऐसा है, तो क्या यह एक अभ्यास है कि ऐसे सभी कार्यों को दो संस्करण प्रदान करना चाहिए? मेरे लिए, मैं बहुत थकाऊ महसूस करता हूँ!

उत्तर

9

आप सही हैं: boost::shared_ptr<const T> getT() const का उद्देश्य यह सुनिश्चित करना है कि const ऑब्जेक्ट्स दुर्घटना से टी को संशोधित नहीं कर सकता है।

सी ++ में, इसे कॉन्स शुद्धता के रूप में जाना जाता है और इसे आमतौर पर अच्छा सी ++ डिज़ाइन माना जाता है। जैसा कि आपने कहा था, यह अक्सर दो संस्करणों (const और एक गैर-const संस्करण) वाले गेटर्स में परिणाम देता है। यह शुरुआत में थकाऊ हो सकता है (हालांकि इसे उपयोग करने के बाद यह बुरा नहीं है), लेकिन परिणाम काफी उपयोगी हो सकते हैं। कॉन्स्ट शुद्धता तुम जैसे

void DoSomething(const AccessT& item); 

कि इतना है कि संकलक एक त्रुटि फेंकता है तो DoSomething कुछ भी है कि संभवतः item को संशोधित रूप में घोषित किया है करता item संशोधित करने के लिए नहीं वादा कार्यों की घोषणा कर सकते हैं।

हालांकि स्थिरांक शुद्धता आमतौर पर अच्छा सी ++ डिजाइन माना जाता है, कुछ डेवलपर्स तय करते हैं कि स्थिरांक और कुछ कार्यों के गैर स्थिरांक संस्करणों घोषित करने के लिए की तुलना में यह लायक है और अधिक परेशानी होने की होने की भूमि के ऊपर।

सी ++ एफएक्यू में a whole section कॉन्स शुद्धता पर है, यदि आप अधिक जानकारी में रूचि रखते हैं।

1

यह पैटर्न सामान्य है जब एक्सेसर क्लास की आवश्यकता महसूस होती है, लेकिन लेखक AccessT और AccessTconst को एक्सेस और निरंतर पहुंच के लिए परिभाषित करने का पूरा तरीका नहीं लेना चाहता। आप जो हैक देखते हैं वह लगातार और गैर-निरंतर एक्सेसर्स के माध्यम से निरंतर और निरंतर पहुंच बनाने का कम कठिन तरीका है।

इस पैटर्न का लाभ एक आसान कार्यान्वयन है, नुकसान यह है कि आप "कॉन्स्ट पॉइंटर" और "पॉइंटर टू कॉन्स्ट" की अवधारणाओं को जोड़ते हैं। यदि कोई एक्सेसटी setT सदस्य प्रदान करता है, तो कॉन्स्टेस के बारे में भ्रम उत्पन्न होगा।

आप इस एक्सेस पैटर्न को const_ पैटर्न के साथ दिखा सकते हैं उदा। Iterators द्वारा, जो const_iterator और iterator के रूप में आते हैं और परिवर्तनीय पुनरावर्तक के सभी चार संयोजनों को बदलने और बदलने योग्य पुनरावृत्त करने की अनुमति देते हैं।