簡體   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