एक मेयर्स की तुलना में अधिक वर्बोज़ सा है, लेकिन मैं यह कर सकता है:
class X {
private:
// This method MUST NOT be called except from boilerplate accessors.
Z &_getZ(size_t index) const {
return something;
}
// boilerplate accessors
public:
Z &getZ(size_t index) { return _getZ(index); }
const Z &getZ(size_t index) const { return _getZ(index); }
};
कारण है कि यह निजी है निजी विधि अवांछनीय गुण है कि यह एक स्थिरांक उदाहरण के लिए एक गैर स्थिरांक जेड & देता है, जो है । निजी विधियां बाहरी इंटरफ़ेस के इनवेरिएंट को तोड़ सकती हैं (इस मामले में वांछित invariant "एक कॉन्स ऑब्जेक्ट को इसके द्वारा प्राप्त संदर्भों के माध्यम से संशोधित संदर्भों के माध्यम से संशोधित नहीं किया जा सकता है")।
ध्यान दें कि टिप्पणियां पैटर्न का हिस्सा हैं - _getZ का इंटरफ़ेस निर्दिष्ट करता है कि इसे कॉल करने के लिए कभी भी वैध नहीं है (स्पष्ट रूप से एक्सेसर्स से अलग): ऐसा करने के लिए कोई कल्पनीय लाभ नहीं है, क्योंकि यह टाइप करने के लिए 1 और वर्ण है और परिणामस्वरूप छोटे या तेज़ कोड नहीं होंगे। विधि को कॉल करना एक कॉन्स्ट_कास्ट वाले एक्सेसर्स में से किसी एक को कॉल करने के बराबर है, और आप इसे भी नहीं करना चाहेंगे। यदि आप त्रुटियों को स्पष्ट करने के बारे में चिंतित हैं (और यह एक उचित लक्ष्य है), तो _getZ के बजाय इसे const_cast_getZ पर कॉल करें।
वैसे, मैं मेयर्स के समाधान की सराहना करता हूं। मेरे पास इसके लिए कोई दार्शनिक आपत्ति नहीं है। व्यक्तिगत रूप से, हालांकि, मैं नियंत्रित पुनरावृत्ति का एक छोटा सा हिस्सा पसंद करता हूं, और एक निजी विधि जिसे केवल कुछ कसकर नियंत्रित परिस्थितियों में ही जाना चाहिए, जो कि लाइन शोर की तरह दिखता है। अपने जहर उठाओ और इसके साथ छड़ी।
[संपादित करें: केविन ने सही ढंग से इंगित किया है कि _getZ एक और विधि (जेनरजेड कहें) को कॉल करना चाह सकता है जो कि GetZ है। इस मामले में, _getZ एक कॉन्स जेड & देखेंगे और इसे वापस करने से पहले इसे const_cast करना होगा। यह अभी भी सुरक्षित है, क्योंकि बॉयलरप्लेट एक्सेसर सबकुछ दिखाता है, लेकिन यह स्पष्ट रूप से स्पष्ट नहीं है कि यह सुरक्षित है। इसके अलावा, यदि आप ऐसा करते हैं और उसके बाद जेनरजेड को हमेशा कॉन्स लौटने के लिए बदलते हैं, तो आपको हमेशा गेज को वापस करने के लिए getZ को बदलने की आवश्यकता होती है, लेकिन कंपाइलर आपको यह नहीं बताएगा कि आप करते हैं।
संकलक के बारे में बाद का बिंदु मेयर्स के अनुशंसित पैटर्न के बारे में भी सच है, लेकिन एक गैर-स्पष्ट const_cast के बारे में पहला बिंदु नहीं है। तो संतुलन पर मुझे लगता है कि अगर _getZ को इसके वापसी मूल्य के लिए conststcast की आवश्यकता होती है, तो यह पैटर्न मेयर्स के ऊपर अपना बहुत अधिक मूल्य खो देता है। चूंकि मेयर्स की तुलना में यह नुकसान भी पीड़ित है, मुझे लगता है कि मैं उस स्थिति में उसके पास जाऊंगा। एक से दूसरे में रिफैक्टरिंग करना आसान है - यह कक्षा में किसी भी अन्य वैध कोड को प्रभावित नहीं करता है, क्योंकि केवल अमान्य कोड और बॉयलरप्लेट _getZ कॉल करता है।]
इस उदाहरण में मैं कॉन्स्ट केस में एक मूल्य वापस कर दूंगा ताकि आप नीचे रिफैक्टरिंग नहीं कर सकें। int जेड() कॉन्स {रिटर्न जेड; } –
मौलिक प्रकारों के लिए, आप बिल्कुल सही हैं! मेरा पहला उदाहरण बहुत अच्छा नहीं था। आइए मान लें कि इसके बजाय हम इसके बजाय कुछ क्लास इंस्टेंस लौट रहे हैं। (मैंने इसे प्रतिबिंबित करने के लिए प्रश्न अपडेट किया।) – Kevin