2013-11-24 5 views
3

나는 심각도 채널 로거를 사용하려고하지만 BOOST_LOG_SEV가 CONST 방법은 없다는 함께 문제를 히트 - 나는 때문에 모두 open_record()와 push_record()부스트 로그 로거 작업이 왜 const가 아닌지?

이 기본적으로 만들기 위해 저를 강제로 생각하고 내 클래스의 모든 메서드는 로거에 쓰고 싶기 때문에 const가 아닙니다. 나는 그렇게 할 여유가 없다. 그래서 나는 현재 글로벌 로거에만 국한되어있다.

내 현재 구현에서

, 각 클래스는 (자신의 생성자에서 초기화) 채널과 클래스 이름의 로거를 가지고, 그리고 내가 이유를 듣고 싶네요 BOOST_LOG_SEV(this->logger, level)

어떤 점에서 로그 메시지를 발행 non-constness 뒤에 그리고 만약 나의 디자인이 Boost :: Log를위한 것이 아니면.

+0

부스트는 오픈 소스 애프터 콜이므로 소스 코드를 참조하기 만하면됩니다. 나는 그것이 질문을하고 대답을 기다리는 것보다 빠를 것이라고 생각합니다. –

+0

상태를 변경하기 때문에 비 const가 될 수 없습니다. 로거가 스레드로부터 안전하다하더라도 mutable 키워드를 사용해야하는 곳의 완벽한 예입니다. 로거는 객체의 상태에 영향을주지 않는 비 const 스레드 안전 멤버입니다. – John5342

+0

그러면 더 좋은 디자인이 될 것입니까? 모든 메소드를 non-const로 만들어야하기 때문에 로거 클래스 멤버를 만드는 것은 문제가되지 않습니다. – Carneiro

답변

4

로거는 자신의 상태를 변경하기 때문에 const 일 수 없습니다. 로거가 스레드로부터 안전하고 객체의 논리 상태를 변경하지 않으면 mutable 키워드를 사용해야하는 곳의 완벽한 예가됩니다.

로거 변경 가능 클래스 멤버 mutable SomeLoggerType my_logger;을 만듭니다. 그런 다음 const 멤버에서 수정할 수 있습니다. 이것은 바로 mutable의 의미입니다.

mutable이 나쁜 코드 냄새가 나는 것에 대한 귀하의 의견에 따르면, mutable은 이런 종류의 목적을위한 탈출 해치입니다. 객체의 논리 상태를 실제로 수정하지 않고 (내부적으로 동기화 된 C++ 11에서) 변경 가능합니다. 변경 가능한 사용법의 또 다른 완벽한 예는 캐싱입니다.

+0

편집자 : 와르 (Igor)에게 감사드립니다. 그것은 저에게 전화의 작은 화면에 빠른 대답을 쓰도록 가르쳐 줄 것입니다. – John5342