2012-04-24 42 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)); 
相关问题