我在使用記錄器類中的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
'endl'不是一個常數或類似的東西。相反,它是一個函數,像'std :: endl(std :: cout)'。你可能會爲此做出具體的安排。 – 2012-02-22 20:38:18
爲什麼不只是'std :: streambuf'被實現?在這種方式下,您可以執行如下操作:'MyStreamBuf * buf = new MyStreamBuf(); std :: ostream logger(buf);'你應該只實現3個函數:'sync','overflow'和'underflow'。 – Naszta 2012-02-22 20:40:06
您將所有內容打印到'cout',但不是'endl'! (首先爲數值觸發重載,last爲endl,第一個包含'cout << value',而last則不包含 – Lol4t0 2012-02-22 20:50:42