【问题标题】:Overridden std::ostream flush() function not called by std::flush重载的 std::ostream flush() 函数未被 std::flush 调用
【发布时间】:2014-07-29 15:25:12
【问题描述】:

我已经覆盖了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;

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

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

【问题讨论】:

    标签: c++ templates stl flush ostream


    【解决方案1】:

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

    【讨论】:

    • 值得注意的是mystream &lt;&lt; "Test"的结果是对ostream的引用,而不是对CMyStream的引用。因此直接调用 ostream 的非虚拟刷新方法。
    • 添加virtual没有效果,我已经用它更新了代码。
    • @DaleWilson 好吗?那么如何修改mystream &lt;&lt; "Test" 以便引用CMyStream 而不是std::ostream?
    • @DaleWilson 不,不要走那条路。 Slava 已经告诉过你应该怎么做。
    • @IngeHenriksen 您不能将 virtual 添加到 std::ostream::flush 方法,将 virtual 添加到您的类方法将无济于事。再说一次,您不应该这样做,您应该在缓冲区中实现该行为。
    猜你喜欢
    • 2023-01-18
    • 2018-11-15
    • 2012-12-15
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 2015-07-18
    相关资源
    最近更新 更多