यदि संभव हो तो, गैर-सदस्य और गैर-मित्र कार्यों के रूप में।
हर्ब सटर और स्कॉट मेयर्स द्वारा वर्णित के रूप में, इनकैप्सुलेशन को बढ़ाने में मदद करने के लिए गैर-सदस्य गैर-सदस्य कार्यों को प्राथमिकता देते हैं।
कुछ मामलों में, C ++ स्ट्रीम की तरह, आपके पास विकल्प नहीं होगा और गैर-सदस्य फ़ंक्शन का उपयोग करना होगा।
लेकिन फिर भी, इसका मतलब यह नहीं है कि आपको इन कार्यों को अपनी कक्षाओं का मित्र बनाना है: ये कार्य अभी भी आपकी कक्षा के एक्सेसर्स के माध्यम से आपकी कक्षा को स्वीकार कर सकते हैं। यदि आप इस तरह से उन कार्यों को पूरा करने में सफल होते हैं, तो आप जीत गए।
ऑपरेटर के बारे में << और >> प्रोटोटाइप
मेरा मानना है कि आपके प्रश्न में दिए गए उदाहरण गलत हैं। उदाहरण के लिए;
ostream & operator<<(ostream &os) {
return os << paragraph;
}
मैं यह भी सोचना शुरू नहीं कर सकता कि यह तरीका एक धारा में कैसे काम कर सकता है।
<< और >> ऑपरेटरों को लागू करने के दो तरीके यहां दिए गए हैं।
मान लीजिए कि आप टाइप T जैसी स्ट्रीम-ऑब्जेक्ट का उपयोग करना चाहते हैं।
और यह कि आप अपने प्रकार के अनुच्छेद के प्रासंगिक डेटा को / से T / में सम्मिलित करना / सम्मिलित करना चाहते हैं।
जेनेरिक ऑपरेटर << और >> फ़ंक्शन प्रोटोटाइप
पहले कार्यों के रूप में:
// T << Paragraph
T & operator << (T & p_oOutputStream, const Paragraph & p_oParagraph)
{
// do the insertion of p_oParagraph
return p_oOutputStream ;
}
// T >> Paragraph
T & operator >> (T & p_oInputStream, const Paragraph & p_oParagraph)
{
// do the extraction of p_oParagraph
return p_oInputStream ;
}
जेनेरिक ऑपरेटर << और >> विधि प्रोटोटाइप
दूसरी विधियों के रूप में:
// T << Paragraph
T & T::operator << (const Paragraph & p_oParagraph)
{
// do the insertion of p_oParagraph
return *this ;
}
// T >> Paragraph
T & T::operator >> (const Paragraph & p_oParagraph)
{
// do the extraction of p_oParagraph
return *this ;
}
ध्यान दें कि इस संकेतन का उपयोग करने के लिए, आपको टी की कक्षा घोषणा को विस्तारित करना होगा। एसटीएल वस्तुओं के लिए, यह संभव नहीं है (आप उन्हें संशोधित करने के लिए नहीं हैं ...)।
और क्या होगा यदि T एक C ++ स्ट्रीम है?
यहां सी ++ धाराओं के लिए समान << और >> ऑपरेटरों के प्रोटोटाइप हैं।
जेनेरिक बेसिक_स्ट्रीम और बेसिक_स्ट्रीम के लिए
ध्यान दें कि धाराओं के मामले में, जैसा कि आप C ++ स्ट्रीम को संशोधित नहीं कर सकते हैं, आपको फ़ंक्शन को लागू करना होगा। जिसका अर्थ कुछ इस प्रकार है:
// OUTPUT << Paragraph
template <typename charT, typename traits>
std::basic_ostream<charT,traits> & operator << (std::basic_ostream<charT,traits> & p_oOutputStream, const Paragraph & p_oParagraph)
{
// do the insertion of p_oParagraph
return p_oOutputStream ;
}
// INPUT >> Paragraph
template <typename charT, typename traits>
std::basic_istream<charT,traits> & operator >> (std::basic_istream<charT,traits> & p_oInputStream, const CMyObject & p_oParagraph)
{
// do the extract of p_oParagraph
return p_oInputStream ;
}
चार istream और ostream के लिए
निम्नलिखित कोड केवल चार-आधारित धाराओं के लिए काम करेगा।
// OUTPUT << A
std::ostream & operator << (std::ostream & p_oOutputStream, const Paragraph & p_oParagraph)
{
// do the insertion of p_oParagraph
return p_oOutputStream ;
}
// INPUT >> A
std::istream & operator >> (std::istream & p_oInputStream, const Paragraph & p_oParagraph)
{
// do the extract of p_oParagraph
return p_oInputStream ;
}
Rhys Ulerich ने इस तथ्य के बारे में टिप्पणी की कि चार-आधारित कोड है, लेकिन इसके ऊपर के सामान्य कोड का "विशेषज्ञता" है। बेशक, Rhys सही है: मैं चार-आधारित उदाहरण के उपयोग की अनुशंसा नहीं करता हूं। यह केवल यहाँ दिया गया है क्योंकि यह पढ़ने में सरल है। जैसा कि यह केवल व्यवहार्य है यदि आप केवल चार-आधारित धाराओं के साथ काम करते हैं, तो आपको इसे उन प्लेटफार्मों पर नहीं बचना चाहिए जहां wchar_t कोड आम है (यानी विंडोज पर)।
आशा है कि यह मदद करेगा।