2012-04-24 5 views
5

私は様々なメッセージ出力を持つクラスを書いています。私はこのクラスを一般的かつプラットフォームに依存しないようにしたいので、私はbasic_ostreamの参照を渡すことを考えていて、すべてのメッセージをストリームにダンプすることができます。これを行うことで、クラスがコンソールプログラムで使用されている場合は、std :: coutをそれに渡してコンソールウィンドウに表示することができます。C++ std :: basic_ostreamから派生し、<<演算子を仮想にする方法?

または、派生したostreamを渡して、メッセージをいくつかのUIコンポーネントにリダイレクトすることができます。リストボックス?唯一の問題は、データ挿入器operator <<が仮想関数ではないことです。派生クラス参照を渡すと、basic_ostream < <演算子だけが呼び出されます。

これに対応する方法はありますか?

元々の質問の一部として計上
+3

なぜなら、汎用の 'std :: ostream'インターフェースを使用して、' 'st ambuf'あなたのコンテキストに基づいて?仮想機能は必要ありません。 – mavam

+3

メンバー以外の関数を仮想にすることはできません。 'operator <<'は 'basic_ostream'のメンバーではなく、自由な関数です。 –

+0

@MatthiasVallentin:しかし、私は基本クラスstd :: ostream参照を自分のクラスに渡す必要があります。そのような場合、ostreamの<<演算子から派生したクラスは決して呼び出されません。 –

答えて

1

ナンチャンの自身の答えは、:

はフォローアップ: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)); 
関連する問題