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

时间:2012-02-22 20:34:06

标签: c++ windows io

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

3 个答案:

答案 0 :(得分:3)

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

只是为了解释当前发生的情况:当您致电f(*this)时,调用函数f()并使用std::ostream基础接收输出并调用flush()。你的课完全没有了。

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

有很多例子说明了这一点。搜索streambuf和James Kanze或我找一对夫妇。

答案 1 :(得分:2)

试试这个:

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

答案 2 :(得分:1)

您需要将endl发送到某个地方。通过执行f(*this),您尝试将其发送给自己,但您的对象没有必要的方法来执行此操作。如果您查看#include <ostream>,则函数endl会使用函数put\n放入流中,然后将其刷新。

你需要在某处写下终点线。例如,如果您正在写cout,那么您可以执行

(*f)(std::cout);