[英]How to use std::cout or std::ofstream as an input of a single function?
[英]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.error
或logger.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::cout
和std::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.