हाल ही में, मैं कैसे एकाधिक ही टिककर खेल के साथ डिजाइन करना मुश्किल होता बिना केवल पढ़ने के लिए निजी सदस्यों एक्सेस करने के लिए पर एक दिलचस्प चर्चा पाया, और सुझावों में से एक यह इस तरह से करने के लिए किया गया था:कॉन्स संदर्भ सार्वजनिक सदस्य - यह क्यों काम करता है?
#include <iostream>
class A {
public:
A() : _ro_val(_val) {}
void doSomething(int some_val) {
_val = 10*some_val;
}
const int& _ro_val;
private:
int _val;
};
int main() {
A a_instance;
std::cout << a_instance._ro_val << std::endl;
a_instance.doSomething(13);
std::cout << a_instance._ro_val << std::endl;
}
आउटपुट:
$ ./a.out
0
130
GotW#66 स्पष्ट रूप से कहा गया है कि वस्तु के जीवनकाल
शुरू होता है जब अपने निर्माता पूरा करता है सफलतापूर्वक और रिटर्न और न ही मैली। यही है, नियंत्रण कन्स्ट्रक्टर बॉडी या पहले के रिटर्न स्टेटमेंट के अंत तक पहुंचता है।
यदि हां, तो हम कोई गारंटी नहीं कि _val
सदस्य किया गया है ठीक से बार हम पर अमल _ro_val(_val)
द्वारा बनाई होगा। तो उपर्युक्त कोड कैसे काम करता है? क्या यह अनिर्धारित व्यवहार है? या आदिम प्रकारों को वस्तु के जीवनकाल में कुछ अपवाद दिया गया है?
क्या कोई मुझे कुछ संदर्भ में इंगित कर सकता है जो उन चीजों को समझाएगा?
आप इस बारे में चिंतित हैं, तो आप अपनी कक्षा परिभाषा में पहले '_val' घोषित करना चाहिए। सदस्यों को उस क्रम में प्रारंभ किया जाता है जिसमें उन्हें घोषित किया जाता है। (लेकिन जैसा कि उत्तर कहते हैं, आपको इसके संदर्भ में प्रारंभ करने के लिए ऑब्जेक्ट की आवश्यकता नहीं है।) –
ध्यान रखें कि इससे वस्तु के आकार में वृद्धि होगी, और सदस्य तक पहुंचने के लिए अतिरिक्त संकेत की आवश्यकता होगी, जबकि एक इनलाइन गेटर सीधे सदस्य तक पहुंचने के रूप में उतना ही कुशल होगा। यह मुझे गेटटर की तुलना में अधिक अपमानित करता है (क्योंकि आपको यह समझने के लिए कन्स्ट्रक्टर परिभाषा को देखना होगा), लेकिन यह मेरी राय है। –
यदि आप वास्तव में पाते हैं कि आपके गेटर्स और सेटर्स "डिज़ाइन को खराब कर रहे हैं", तो हो सकता है कि आपके डिज़ाइन में कुछ गड़बड़ हो। आप भगवान ऑब्जेक्ट एंटी-पैटर्न का उपयोग कर रहे हैं। Http://stackoverflow.com/questions/565095/java-are-getters-and-setters-evil/565158#565158 – Raedwald