ナンチャンの自身の答えは、:
はフォローアップ:OK、ここで得られた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));
なぜなら、汎用の 'std :: ostream'インターフェースを使用して、' 'st ambuf'あなたのコンテキストに基づいて?仮想機能は必要ありません。 – mavam
メンバー以外の関数を仮想にすることはできません。 'operator <<'は 'basic_ostream'のメンバーではなく、自由な関数です。 –
@MatthiasVallentin:しかし、私は基本クラスstd :: ostream参照を自分のクラスに渡す必要があります。そのような場合、ostreamの<<演算子から派生したクラスは決して呼び出されません。 –