張楠自己的答案,最初發布這一問題的一部分:
追問:好的,這是實現所需的功能派生的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));
爲什麼不使用通用'的std :: ostream'接口和改變底層'STRE初始化ambuf'根據你的情況?不需要虛擬功能。 – mavam 2012-04-24 16:13:28
您不能使非會員功能變爲虛擬。 'operator <<'不是'basic_ostream'的成員,而是一個自由函數。 – 2012-04-24 16:14:56
@MatthiasVallentin:但我需要將基類std :: ostream引用傳遞給我的類。在這種情況下,我從ostream的<<運算符派生的類將永遠不會被調用。 – 2012-04-24 16:25:09