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

how to temporarily use std::cout in place of std::ofstream

本文关键字:std ofstream 何临时 cout      更新时间:2024-09-30

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

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";

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

更新:根据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();
//}
};

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

想想std::cout的实际情况:一个对象。只是:

全局对象std::coutstd::wcout控制输出到〔…〕

因此,当您说要暂时使用std::cout来代替std::ofstream时,您是在将苹果(对象std::cout(与桔子(类std::ofstream(混合。

相反,您要做的是使用std::cout而不是std::ofstream的对象。

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

因此,如注释中所建议的,您可以使error/event引用该类的对象std::ofstreamstd::ostream&,并通过logging_class的适当构造函数使用std::coutstd::ofstream{"filename.txt"}初始化它们。