2012-04-24 10 views
5

मैं एक कक्षा लिख ​​रहा हूं जिसमें विभिन्न संदेश आउटपुट हैं। मैं इस वर्ग को सामान्य और मंच को स्वतंत्र बनाना चाहता हूं, इसलिए मैं मूल_स्ट्रीम को संदर्भित करने के बारे में सोच रहा हूं और यह सभी संदेशों को स्ट्रीम में डंप कर सकता है। ऐसा करके, यदि कक्षा को कंसोल प्रोग्राम में उपयोग किया जाता है, तो मैं std :: cout पास कर सकता हूं और कंसोल विंडो में प्रदर्शित कर सकता हूं।सी ++ std :: basic_ostream से कैसे प्राप्त करें और << ऑपरेटर वर्चुअल बनाएं?

या मैं इसे व्युत्पन्न ओस्ट्रीम पास कर सकता हूं और संदेश को कुछ UI घटकों पर रीडायरेक्ट कर सकता हूं, उदा। सूची बाक्स? एकमात्र समस्या डेटा अवरोधक operator << वर्चुअल फ़ंक्शन नहीं है। यदि मैं व्युत्पन्न क्लास संदर्भ को पास करता हूं, तो केवल basic_ostream < < ऑपरेटर को कॉल किया जाएगा।

क्या इसके लिए कोई कामकाज है?

+3

सामान्य 'std :: ostream' इंटरफ़ेस का उपयोग और अंतर्निहित' stre परिवर्तन नहीं क्यों साथ प्रारंभ ambuf' आपके संदर्भ के आधार पर? कोई वर्चुअल फ़ंक्शन की आवश्यकता नहीं है। – mavam

+3

आप एक गैर-सदस्य कार्य वर्चुअल नहीं बना सकते हैं। 'ऑपरेटर <<' 'basic_ostream' का सदस्य नहीं है, लेकिन एक नि: शुल्क फ़ंक्शन है। –

+0

@MatthiasVallentin: लेकिन मुझे अपनी कक्षा के बेस क्लास std :: ostream संदर्भ को पास करने की आवश्यकता है। ऐसे मामले में, ओस्ट्रीम के << ऑपरेटर से मेरी व्युत्पन्न कक्षा कभी नहीं बुलाई जाएगी। –

उत्तर

1

नान झैंग के अपने जवाब है, मूल रूप से सवाल के हिस्से के रूप तैनात:

अप का पालन करें: व्युत्पन्न std :: streambuf कि कार्यक्षमता की आवश्यकता लागू करता है ठीक है, यहाँ है:

class listboxstreambuf : public std::streambuf { 
public: 
    explicit listboxstreambuf(CHScrollListBox &box, std::size_t buff_sz = 256) : 
      Scrollbox_(box), buffer_(buff_sz+1) { 
     char *base = &buffer_.front(); 
     //set putbase pointer and endput pointer 
     setp(base, base + buff_sz); 
    } 

protected: 
    bool Output2ListBox() { 
     std::ptrdiff_t n = pptr() - pbase(); 
     std::string temp; 
     temp.assign(pbase(), n); 
     pbump(-n); 
     int i = Scrollbox_.AddString(temp.c_str()); 
     Scrollbox_.SetTopIndex(i); 
     return true; 
    } 

private: 
    int sync() { 
     return Output2ListBox()? 0:-1; 
    } 

    //copying not allowed. 
    listboxstreambuf(const listboxstreambuf &); 
    listboxstreambuf &operator=(const listboxstreambuf &); 

    CHScrollListBox &Scrollbox_; 
    std::vector<char> buffer_; 
}; 

उपयोग करने के लिए इस वर्ग के सिर्फ एक std :: ostream बना सकते हैं और इस बफर

std::ostream os(new listboxstreambuf(some_list_box_object)); 
संबंधित मुद्दे