2017-05-07 80 views
2

我想编写一个程序并使用户能够通过设置程序来显示进度或禁用该程序来控制程序包的日志记录。使用std :: ostream和std :: cout进行C++日志记录

我知道std::coutstd::ostream,区别在于std::cout将结果重定向到标准输出。

我想让我的班级拥有一个std::ostream成员,我会记录所有内容。然后,如果用户启用显示,该成员将被附加到std::cout并显示结果,否则它不会。

我心目中是与此类似:

class log { 
private: 
    std::ostream display; 
public: 
    void func(); 
    void show_display(); 
} 

void log::func(){ 
    display << "called by func"; 
} 
void log::show_display(){ 
    // redirect display to standard output 
} 

是否有类似于上面没有办法做到这一点?如果不是,我怎么能有类似的结果?

谢谢。

+3

“不同之处在于std :: cout将结果直接放到屏幕上。” - 不,它写入标准输出 - 你可以从你的shell重定向。 –

+0

@NeilButterworth这绝对是正确的,我很抱歉的错误。我将编辑 – Everyone

+0

您可以将此用于忽略输出的流:http://stackoverflow.com/a/11826666/951890 –

回答

4

流句柄不是可复制的对象,也没有任何用户可以实例化的对象std::ostream。所以你写的课不能工作。你可以做的,而不是为存储指针:

#include <iostream> 

class log { 
    std::ostream* out_; 

public: 
    void func() { 
    if (out) { *out << "called by func"; } 
    // ... 
    } 

    void show_display() { 
    out = &std::cout; 
    } 

    void hide_display() { 
    out = nullptr; 
    } 
}; 

如果你打算建立一个更通用的日志系统,你应该考虑是否记录到残疾输出需要操作数的评价;用户可能会希望日志记录被禁用时,日志语句(如log << expensive_function();)便宜。

+0

我得承认我有这个想法,但希望另一种方式,不涉及每次我想要登录时检查它是否不是'nullptr'。我最终可能只是写一个函数'write'来完成检查并将其放入流中。 – Everyone

+0

@Everyone:您也可以创建自己的记录器对象,该对象不会写入任何内容并无条件记录到该对象,并插入该对象而不是空指针。 –

+0

我想我最终会这样做,因为我会控制'std :: cout'出现的线程安全问题 – Everyone

相关问题