2012-04-24 27 views
5

Tôi đang viết một lớp có nhiều thông điệp đầu ra. Tôi muốn làm cho lớp này nói chung và nền tảng độc lập, vì vậy tôi đang nghĩ đến việc chuyển một tham chiếu basic_ostream vào nó và nó có thể đổ tất cả thư vào luồng. Bằng cách này, nếu lớp được sử dụng trong một chương trình điều khiển, tôi có thể vượt qua std :: cout vào nó và hiển thị trong cửa sổ bảng điều khiển.Làm thế nào để lấy được từ C++ std :: basic_ostream và làm cho toán tử << ảo?

Hoặc tôi có thể chuyển một luồng có nguồn gốc đến nó và chuyển hướng thư đến một số thành phần giao diện người dùng, ví dụ: ListBox? Vấn đề duy nhất là việc chèn dữ liệu operator << không phải là một chức năng ảo. Nếu tôi chuyển tham chiếu lớp dẫn xuất đến nó, chỉ có nhà điều hành basic_ostream < < sẽ được gọi.

Có cách giải quyết nào cho vấn đề này không? Câu trả lời của riêng

+3

Tại sao không sử dụng giao diện 'std :: ostream' và thay đổi ambuf' dựa trên bối cảnh của bạn? Không cần chức năng ảo. – mavam

+3

Bạn không thể thực hiện chức năng không phải thành viên ảo. 'operator <<' không phải là thành viên của 'basic_ostream', mà là một hàm tự do. –

+0

@MatthiasVallentin: Nhưng tôi cần phải vượt qua lớp cơ sở std :: ostream tham chiếu đến lớp của tôi. Trong trường hợp này, lớp dẫn xuất của tôi từ toán tử << của ostream sẽ không bao giờ được gọi. –

Trả lời

1

Nan Zhang của Nguyên văn như là một phần của câu hỏi:

Theo dõi: OK, đây là nguồn gốc std :: streambuf mà thực hiện được yêu cầu chức năng:

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_; 
}; 

Để sử dụng lớp này chỉ tạo một std :: ostream và khởi tạo với bộ đệm này

std::ostream os(new listboxstreambuf(some_list_box_object)); 
Các vấn đề liên quan