gpt4 book ai didi

C++ - 在我自己的类中使用 ostream

转载 作者:太空宇宙 更新时间:2023-11-04 15:50:30 31 4
gpt4 key购买 nike

我在我的记录器类中使用 ostream 时遇到问题。由于某种原因,std::endl 永远不会打印出来,因此不会添加换行符。我确定有问题,我在尝试理解如何在我自己的类(class)中使用我的 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

最佳答案

在使用自定义流缓冲区类时,您掌握了正确的基本方法。但是,这是您要实现特定逻辑的地方,而不是在从 std::ostream 派生的类中。 !

只是为了解释当前发生的事情:当您调用 f(*this) 时函数f()std::ostream 调用接收输出并获得 flush() 的基础叫。你的类(class)完全不合时宜。

这是你应该做的: * 从 MyLogger 中删除输出运算符类(class) *实现overflow()在流缓冲区中处理缓冲区溢出(例如,将字符发送到某处或增加缓冲区) *实现sync()发送任何缓冲字符并在刷新流时执行您需要执行的任何其他操作 * 大概 MyLogger应该拥有流缓冲区并正确设置它的花瓶;通常这都是派生自 std::ostream 的类做

有很多例子说明这看起来像什么。搜索 streambuf和 James Kanze 或我一起寻找一对夫妇。

关于C++ - 在我自己的类中使用 ostream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9402477/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com