2012-02-22 20 views
0

我在使用記錄器類中的ostream時遇到了問題。由於某些原因,std :: endl永遠不會被打印出來,所以不會添加新行。我確定有錯,我在嘗試理解如何在自己的類中使用我的ostream時遇到問題,所以我可能做了一些根本性錯誤。C++ - 在我自己的類中使用ostream

class MyStreamBuf : public std::streambuf 
{ 
    public: 
    MyStreamBuf() : std::streambuf() 
    { 

    } 
}; 

class MyLogger : public std::ostream 
{ 
public: 
    MyLogger(MyStreamBuf* buf) : std::ostream(buf) { mBuf = buf; } 
    ~MyLogger() { delete mBuf; } 

    template <typename T> 
    inline MyLogger& operator << (T const& value) 
    { 
#ifdef _WIN32 || _WIN64 
     std::cout << value; 
#endif 

     return *this; 
    } 

    inline std::ostream& operator << (std::ostream& (*f)(std::ostream&)) 
    { 

     return f(*this); 
    } 

    MyStreamBuf* mBuf; 
}; 



int _tmain(int argc, _TCHAR* argv[]) 
{ 
    MyStreamBuf* buf = new MyStreamBuf(); 
    MyLogger logger(buf); 
    logger << "kekekek" << "asdf: " << 23 << std::endl; 
    logger << "kekekek" << "asdf: " << 23 << std::endl;; 

    getchar(); 
    return 0; 
} 

輸出:

kekekekasdf: 23kekekekasdf: 23 
+2

'endl'不是一個常數或類似的東西。相反,它是一個函數,像'std :: endl(std :: cout)'。你可能會爲此做出具體的安排。 – 2012-02-22 20:38:18

+0

爲什麼不只是'std :: streambuf'被實現?在這種方式下,您可以執行如下操作:'MyStreamBuf * buf = new MyStreamBuf(); std :: ostream logger(buf);'你應該只實現3個函數:'sync','overflow'和'underflow'。 – Naszta 2012-02-22 20:40:06

+0

您將所有內容打印到'cout',但不是'endl'! (首先爲數值觸發重載,last爲endl,第一個包含'cout << value',而last則不包含 – Lol4t0 2012-02-22 20:50:42

回答

2

試試這個:

inline std::ostream& operator << (std::ostream& (*f)(std::ostream&)) 
{ 
     std::cout << f; 
     return *this; 
} 
1

你需要的地方發送ENDL。通過做f(*this)你試圖把它發送給自己,但你的對象沒有必要的方法來做到這一點。如果您查看#include <ostream>,功能endl使用功能put\n放入流中,然後刷新它。

您需要在某處寫入結束行。例如,如果你正在寫cout那麼你可以做

(*f)(std::cout); 
3

您使用自定義數據流緩存類時,得到的基本方法正確。但是,這是您想要實現特定邏輯的地方,而不是從std::ostream派生的類!

只是爲了解釋什麼當前發生的情況:當你調用f(*this)功能f()被稱爲與接收輸出,並得到flush()稱爲std::ostream基地。你的班級完全沒有照片。

這裏是你應該做的: *您MyLogger類 *去除輸出運營商實現overflow()你流緩衝區處理溢出的緩衝區(如某處發送字符或增加緩衝) *實現sync()到發送任何緩衝字符並在流刷新時做任何其他你需要做的事情 *可能MyLogger應擁有流緩衝區並正確設置其花瓶;通常這是從std::ostream衍生而來的全部類別

這裏有很多關於這看起來如何的示例。搜索streambuf和James Kanze或我找到一對夫婦。

相關問題