मैं कैसेट का उपयोग कर सकता हूं << myclass


82

myclass मेरे द्वारा लिखा गया C ++ वर्ग है और जब मैं लिखता हूं:

myclass x;
cout << x;

मैं कैसे या एक मूल्य की तरह उत्पादन 10या ?20.2integerfloat

जवाबों:


100

आमतौर पर operator<<अपनी कक्षा के लिए ओवरलोडिंग द्वारा :

struct myclass { 
    int i;
};

std::ostream &operator<<(std::ostream &os, myclass const &m) { 
    return os << m.i;
}

int main() { 
    myclass x(10);

    std::cout << x;
    return 0;
}

9
ध्यान दें कि यदि myclassकोई privateफ़ील्ड है, और आप operator<<()उन्हें आउटपुट करना चाहते हैं, तो एक मित्र के रूप में myclassघोषित करना चाहिए std::ostream& operator<<(std::ostream&, myclass const&)
जस्टिन टाइम - मोनिका

3
const myclass &mइसके बजाय यह नहीं होना चाहिए myclass const &m?
नुबेक्यू

3
@ नोट: संकलक जहां तक ​​बात है, दोनों का मतलब एक ही है, लेकिन मैं अभी भी उपसर्ग फॉर्म को गलत मानता हूं। C ++ घोषणापत्र पढ़ने के लिए, आप जो घोषित किया जा रहा है, उससे शुरू करते हैं, और constटाइप करने के बाद अपने तरीके से काम करते हैं m is a reference to a const myclass। इसके साथ प्रकार से पहले, यह कहता है "एम एक मायक्लास कॉन्स्टेंस का संदर्भ है, जो कि व्यर्थ और सही मायने में अनियंत्रित के बीच दांतेदार किनारे पर है।
जैरी कॉफिन

1
किसी के रूप में मेरे लिए उलझन में, ऑपरेटर को अपनी कक्षा की परिभाषा के बाहर ओवरलोडिंग में डाल दें (उदाहरण की तरह)।
इनेमिकोस

1
@ लोरेंजो: नहीं, यह एक सदस्य समारोह नहीं हो सकता। अधिक जानकारी के लिए stackoverflow.com/a/9814453/179910 देखें ।
जेरी कॉफिन

22

आपको <<ऑपरेटर को अधिभारित करने की आवश्यकता है ,

std::ostream& operator<<(std::ostream& os, const myclass& obj)
{
      os << obj.somevalue;
      return os;
}

फिर जब आप करते हैं cout << x( आपके मामले में xप्रकार myclassका है), तो आपने इसे विधि में जो कुछ भी बताया है, उसे आउटपुट करेगा। ऊपर के उदाहरण के मामले में यह x.somevalueसदस्य होगा।

यदि सदस्य के प्रकार को सीधे एक में नहीं जोड़ा जा सकता है ostream, तो आपको <<उस प्रकार के लिए ऑपरेटर को ओवरलोड करने की आवश्यकता होगी , ऊपर उसी विधि का उपयोग करके।


4
वह लेफ्ट शिफ्ट ऑपरेटर है, न कि "स्ट्रीम ऑपरेटर"। Iostreams के संदर्भ में, यह या तो प्रविष्टि या निष्कर्षण ऑपरेटर है, लेकिन यह स्ट्रीम ऑपरेटर कभी नहीं है।
बिली ओनली

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

14

यह बहुत आसान है, बस लागू करें:

std::ostream & operator<<(std::ostream & os, const myclass & foo)
{
   os << foo.var;
   return os;
}

आउटऑउट को चेन करने के लिए आपको os के संदर्भ में वापस लौटने की आवश्यकता है (cout << foo << 42 << endl)


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.