2017-05-07 12 views
2

プログレスを表示するようにプログラムを設定するか、それを無効にすることで、プログラムを書き、ユーザーがパッケージのロギングを制御できるようにします。std :: ostreamとstd :: coutを使ったロギング

私は、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が結果を画面に直接表示するという違いがあります。 - いいえ、標準出力に書き込みます。シェルからその出力をリダイレクトできます。 –

+0

@NeilButterworthこれは間違いなく申し訳ありません。私は編集します – Everyone

+0

出力を無視するストリームのためにこれを使うことができます:http://stackoverflow.com/a/11826666/951890 –

答えて

4

ストリームハンドルはコピー可能オブジェクトではなく、ユーザーがインスタンス化できるオブジェクトもありません。したがって、書かれたあなたのクラスは動作しません。あなたが代わりに行うことができますことは、ポインタを格納している:

#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

関連する問題