मेयर्स की तुलना में थोड़ी अधिक क्रिया, लेकिन मैं ऐसा कर सकता हूं:
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); }
};
निजी पद्धति के पास अवांछनीय संपत्ति है कि यह एक गैर-ज़ेड Z & एक कास्ट इंस्टेंस के लिए लौटाता है, यही कारण है कि यह निजी है। निजी विधियाँ बाहरी इंटरफ़ेस के आवेगों को तोड़ सकती हैं (इस मामले में वांछित अपरिवर्तनीय है "एक कॉस्ट ऑब्जेक्ट को इसके माध्यम से प्राप्त वस्तुओं के माध्यम से संशोधित नहीं किया जा सकता है, जिसमें यह है" - "।
ध्यान दें कि टिप्पणियां पैटर्न का हिस्सा हैं - _getZ का इंटरफ़ेस निर्दिष्ट करता है कि इसे कॉल करने के लिए कभी भी मान्य नहीं है (एक्सेसर्स से अलग, जाहिर है): वैसे भी ऐसा करने के लिए कोई बोधगम्य लाभ नहीं है, क्योंकि यह टाइप करने के लिए 1 और चरित्र है और नहीं छोटे या तेज कोड में परिणाम। विधि को कॉल करना कॉन्स्टॉक के साथ एक्सेसर्स में से एक को कॉल करने के बराबर है, और आप ऐसा नहीं करना चाहेंगे। यदि आप त्रुटियों को स्पष्ट करने के बारे में चिंतित हैं (और यह एक उचित लक्ष्य है), तो इसे _getZ के बजाय const_cast_getZ पर कॉल करें।
वैसे, मैं मेयर्स के समाधान की सराहना करता हूं। मुझे इससे कोई दार्शनिक आपत्ति नहीं है। व्यक्तिगत रूप से, हालांकि, मैं नियंत्रित पुनरावृत्ति का एक छोटा सा हिस्सा पसंद करता हूं, और एक निजी विधि जिसे केवल कुछ कसकर नियंत्रित परिस्थितियों में कहा जाना चाहिए, एक विधि पर जो लाइन शोर की तरह दिखती है। अपना जहर उठाओ और इसके साथ रहो।
[संपादित करें: केविन ने ठीक ही इंगित किया है कि _getZ आगे की विधि (जनरेट कह सकता है) को कॉल करना चाह सकता है जो उसी तरह से कास्ट-स्पेशलाइज़्ड है जैसे गेटज़। इस स्थिति में, _getZ एक const Z देखेगा और वापसी से पहले उसे const_cast करना होगा। यह अभी भी सुरक्षित है, क्योंकि बॉयलरप्लेट एक्सेसर सब कुछ पॉलिस करता है, लेकिन यह बिल्कुल स्पष्ट नहीं है कि यह सुरक्षित है। इसके अलावा, यदि आप ऐसा करते हैं और फिर बाद में हमेशा के लिए कॉन्स्टैज को बदल देते हैं, तो आपको गेट को हमेशा के लिए वापस लाने की जरूरत है, लेकिन कंपाइलर आपको यह नहीं बताएगा कि आप करते हैं।
कंपाइलर के बारे में बाद का बिंदु भी मेयर्स के अनुशंसित पैटर्न के बारे में सही है, लेकिन एक गैर-स्पष्ट const_cast के बारे में पहला बिंदु नहीं है। इसलिए संतुलन पर मुझे लगता है कि अगर _getZ अपने रिटर्न वैल्यू के लिए एक const_cast की जरूरत है, तो यह पैटर्न Meyers की तुलना में बहुत अधिक मूल्य खो देता है। चूंकि यह मेयर्स की तुलना में नुकसान भी झेलता है, मुझे लगता है कि मैं उस स्थिति में उसके पास जाऊंगा। एक से दूसरे में रिफ्लेक्ट करना आसान है - यह केवल अमान्य कोड और बॉयलरप्लेट _getZ को कॉल करने के बाद से कक्षा में किसी अन्य मान्य कोड को प्रभावित नहीं करता है।]