2012-04-24 78 views
5

我正在寫一個具有各種消息輸出的類。我想讓這個類通用和平臺獨立,所以我想通過一個basic_ostream引用它,它可以將所有消息轉儲到流中。通過這樣做,如果班級在控制檯程序中使用,我可以將std :: cout傳遞給它並顯示在控制檯窗口中。如何從C++ std :: basic_ostream派生並使<<運算符爲虛擬?

或者我可以將派生的ostream傳遞給它,並將消息重定向到一些UI組件,例如,列表框?唯一的問題是數據插入器operator <<不是虛擬功能。如果我將派生類引用傳遞給它,那麼只會調用運算符basic_ostream < <運算符。

對此有什麼解決辦法?

+3

爲什麼不使用通用'的std :: ostream'接口和改變底層'STRE初始化ambuf'根據你的情況?不需要虛擬功能。 – mavam 2012-04-24 16:13:28

+3

您不能使非會員功能變爲虛擬。 'operator <<'不是'basic_ostream'的成員,而是一個自由函數。 – 2012-04-24 16:14:56

+0

@MatthiasVallentin:但我需要將基類std :: ostream引用傳遞給我的類。在這種情況下,我從ostream的<<運算符派生的類將永遠不會被調用。 – 2012-04-24 16:25:09

回答

1

張楠自己的答案,最初發布這一問題的一部分:

追問:好的,這是實現所需的功能派生的std ::流緩衝:

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)); 
相關問題