2017-05-07 16 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이 결과를 화면에 직접 표시한다는 차이점이 있습니다." 아니, 표준 출력에 씁니다. 쉘에서 출력 할 수 있습니다. –

+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