2010-06-05 27 views
40

myclass एक सी ++ वर्ग मेरे द्वारा लिखा है कैसे उपयोग कर सकते हैं और जब मैं लिखना:मैं अदालत << MyClass

myclass x; 
cout << x; 

कैसे उत्पादन 10 या 20.2, एक integer या एक float मूल्य की तरह करने के लिए?

उत्तर

7

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

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

आप ओएस के लिए एक संदर्भ के क्रम में श्रृंखला के लिए outpout वापस जाने के लिए की जरूरत है (अदालत < < foo < < endl)

+19

यह एक असीम पुनरावर्ती कार्य है। और यह एक उथल-पुथल हो गया! आपको सप्ताहांत को एसओ पर प्यार करना होगा! –

55
आमतौर

द्वारा 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; 
} 
+0

यह कन्स्ट्रक्टर मान '10' आउटपुट करेगा? –

+1

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

+0

क्या यह 'माइक्लास कॉन्स एंड एम' के बजाय' मेरा माइक्लास और एम 'नहीं होना चाहिए? – Nubcake

17

आप << ऑपरेटर को ओवरलोड की जरूरत है,

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

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

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

+4

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

+1

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

संबंधित मुद्दे