2017-05-07 378 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

相關問題