"मित्र" कीवर्ड का उपयोग किस लिए किया जाता है?


11

क्या आप मुझे समझा सकते हैं कि friendकक्षा के निजी डेटा तक पहुँच अधिकार देने के लिए कीवर्ड को क्यों पसंद किया जाता है?


1
यदि आप पूछते हैं कि क्यों friendपसंद किया गया था, तो आप आमतौर पर बाहर से निजी वर्ग के डेटा का उपयोग करने के लिए किन अन्य तरीकों का उपयोग करते हैं?
बेंजामिन बैनियर

@ हाँक "पसंदीदा" यहाँ उपयोग करने के लिए गलत शब्द हो सकता है। मैंने व्याकरण और व्हाट्सएप को सही करने के लिए अधिकांश पोस्ट को संपादित किया और मैंने मूल शब्द विकल्प को रखा, लेकिन मुझे लगता है कि यहां एक भाषा बाधा हो सकती है।
एडम लेअर

मुझे नहीं पता क्योंकि मैं आज संयोग से दोस्त के बारे में पढ़ता हूं। और लेख कहता है कि अगर मैं दोस्त का उपयोग नहीं करता हूं, तो मैं एक अखंड वर्ग बनाऊंगा।
डाल्टन

जवाबों:


17

मित्र एक वर्ग के इंटरफ़ेस को विस्तारित करने का क्लासिक तरीका है।
लेकिन बड़ी बात यह है कि दोस्त स्पष्ट रूप से विशिष्ट वस्तुओं को एक वर्ग में कसने के लिए आपके इरादे का दस्तावेज है।

नोट: मित्र का उपयोग करके आप मित्रों को कक्षा में कसकर बांध रहे हैं।

एक आदर्श उदाहरण C ++ में स्ट्रीम ऑपरेटर है

class Plop
{
    private:
        int  value;
        friend std::ostream& operator<<(std::ostream& stream, Plop const& data);
        friend std::istream& operator>>(std::istream& stream, Plop&       data);
};

std::ostream& operator<<(std::ostream& stream, Plop const& data)
{
     return stream << data.value << " ";
}
std::istream& operator>>(std::istream& stream, Plop&       data)
{
     return stream >> data.value;
}

यहाँ हम एक तरह से Plop क्लास के सार्वजनिक इंटरफ़ेस का विस्तार कर रहे हैं, जो हमें ऑब्जेक्ट को स्ट्रीम में और बाहर स्ट्रीम करने की अनुमति देता है, लेकिन आंतरिक कार्यान्वयन को उजागर किए बिना या भविष्य में कार्यान्वयन के सिरदर्द का कारण बन सकता है, जिसके लिए गेट / सेट विधियों के उपयोग की आवश्यकता होती है बनाए रखा जाए (क्योंकि वे सार्वजनिक इंटरफ़ेस का हिस्सा होंगे) भले ही आंतरिक कार्यान्वयन बदल गया हो।

नोट: यह एनकैप्सुलेशन को नहीं तोड़ता है, लेकिन यह स्ट्रीम ऑपरेटर्स को प्लॉप क्लास के कार्यान्वयन के लिए कसकर बाध्य करता है (यानी प्लॉप क्लास के कार्यान्वयन में किसी भी बदलाव के लिए स्ट्रीम ऑपरेटरों के कार्यान्वयन में बदलाव की आवश्यकता होगी)। लेकिन यह अपेक्षित है। सार्वजनिक इंटरफ़ेस (सार्वजनिक / संरक्षित विधियों सहित) के सभी भाग कसकर कार्यान्वयन के लिए बाध्य हैं।

लेकिन ध्यान दें: आपने स्पष्ट रूप से इस बंधन को वर्ग घोषणा के भाग के रूप में प्रलेखित किया है।

नोट: मैं निजी डेटा को उजागर करने के पसंदीदा तरीके के रूप में मित्र को नहीं संदर्भित करूंगा। कार्यान्वयन को उजागर करने के साथ मित्र का अधिक उपयोग उतना ही बुरा हो सकता है। सभी भाषा विशेषताओं की तरह इसका उपयोग विवेकपूर्ण तरीके से किया जाना चाहिए।


यदि आप सार्वजनिक रूप से डेटा का उपयोग कर सकते हैं (उदाहरण के लिए एक गटर के माध्यम से) तो क्या आपने इसके बजाय एक निशुल्क फ़ंक्शन का उपयोग किया होगा?
आयोन्ना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.