gpt4 book ai didi

c++ - 覆盖的 std::ostream flush() 函数未被 std::flush 调用

转载 作者:行者123 更新时间:2023-11-30 02:44:53 27 4
gpt4 key购买 nike

我已经覆盖了 std::ostream::flush() 函数。下面我从示例中删除了所有其他代码:

#include <iostream>
#include <ostream>

class CMyStream : public std::streambuf, public std::ostream
{
public:
explicit CMyStream() throw() : std::ostream(this)
{
// Intentionally empty block
}

std::ostream &flush()
{
std::cout << "Overridden flush called\n";
return (*this);
}

int sync()
{
std::cout << "Overridden sync called\n";
return 0; // Success
}

};

我尝试这样使用它:

CMyStream myStream;
myStream << "Test" << std::flush;

,但被覆盖的 CMyStream::flush()CMyStream::sync() 函数不会被 std::flush 调用> 操纵器。如果我调试,我会看到默认的 std::ostream::flush() 被调用,而不是我的覆盖函数。

有没有办法解决这个问题,还是我必须直接调用 myStream.flush() 而不是使用操纵器?

最佳答案

问题是 std::ostream::flush 方法不是虚拟的,所以你不能正确地覆盖它,你也不应该。你应该做的是创建你自己的缓冲类继承自 std::basic_streambufstd::basic_filebufstd::basic_stringbuf 和覆盖那里 protected int sync() 方法。然后,您的流类应该在其构造函数中创建适当的缓冲区类型。

关于c++ - 覆盖的 std::ostream flush() 函数未被 std::flush 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25019067/

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