繁体   English   中英

如何临时使用 std::cout 代替 std::ofstream

[英]how to temporarily use std::cout in place of std::ofstream

如果我想创建一个日志记录 class,比如说

class logging_class {
public:
    std::ofstream error;
    std::ofstream event;
    logging_class() {}
    logging_class(string err, string evt) {
        error.open(err);
        event.open(evt);
    }
    ~logging_class() {
        error.close();
        event.close();
    }
};

以便以后我可以轻松创建程序日志:

logging_class logger("Log_Error.txt","Log_Event.txt");
logger.error << "something wrong";
logger.event << "something interesting";

现在,在开发的早期,我想将所有 output 重定向到屏幕(即 std::cout)。 我不想改变logger.error<<"something wrong";的用法std::cout<<"something wrong"; ,因为稍后我需要将std::cout的所有实例更改为logger.errorlogger.event (可能有数千个)。 我可以在 class 记录器中进行一些简单的更改来做到这一点吗?

更新:按照 Enlico 的指示,我可以将logging_class修改为:

class logging_class {
public:
    //std::ofstream error;
    //std::ofstream event;
    std::ostream& error;
    std::ostream& event;
    logging_class():error(std::cout),event(std::cout) {}
    //logging_class(string err, string evt) {
    //    error.open(err);
    //    event.open(evt);
    //}
    //~logging_class() {
    //    error.close();
    //    event.close();
    //}
};

在使用默认构造函数创建 object 之后: logging_class logger; 我现在可以将所有日志记录重定向到屏幕显示。

想想std::cout实际上是什么:一个 object。 就是这样:

全局对象std::coutstd::wcout控制 output 到 […]

因此,当您说要临时使用std::cout代替std::ofstream时,您是在将苹果(对象std::cout )与橙子(类std::ofstream )混合在一起。

相反,您想要做的是使用std::cout而不是object 的class std::ofstream

但是std::cout不是 class std::ofstream ,所以error不能保留它; 它属于 class std::ostream ,它是前者的超类。

因此,正如评论中所建议的,您可以对 class、 std::ofstream std::ostream&的 object 进行error / event引用,并使用std::cout或使用std::ofstream{"filename.txt"}通过logging_class的适当构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM