2011-12-12 9 views
0

나는 가상 Log(std::string const&) 메서드를 가진 추상 Logger 클래스를 가지고있다. 그렇게하면 모든 유형의 로깅을 구현할 수 있습니다.Logger에 대한 변경 가능한 참조를 유지하는 것이 좋습니다.

예를 들어 Logger (QtLogger)의 Qt 구현을 만들 수 있기 때문에 메서드가 const가 아닙니다. 따라서 위젯에 로그온하여 객체를 수정합니다.

이제는 고유 한 QtLogger 개체를 유지하고 무언가를 기록해야하는 개체를 참조로 전달한다고 가정 해 보겠습니다. 문제는 Log() 메서드가 const가 아니므로 const 메서드에서 아무 것도 기록 할 수 없다는 것입니다.

QtLogger에 대한 변경 가능한 참조를 유지하는 것이 좋습니다?

그렇다면 gcc에서 다음 오류가 발생하는 이유는 무엇입니까? (4.6.1)
reference ‘_logger’ cannot be declared ‘mutable’ [-fpermissive]

편집 : 참조 선언하는 방법 : QtLogger mutable& _logger;

+0

이야기에서 길을 잃어 버렸습니다. (그리고 나는 결코 변하기 쉽습니다.)하지만 const 캐스트로 문제를 해결할 수 있습니까? –

답변

0

로거 인터페이스는 항상 const해야한다, 사용자는 알 필요가 없습니다 당신이 수도 변화 물건이 그가 뭔가를 기록 할 때. 보다 나은 디자인은 Log 메소드 const을 만들고 파생 클래스에 로그 메소드에서 변경하려는 경우 멤버가되도록 mutable해야한다고 알리는 것입니다. 사용자에게 해당 파트를 푸시하지 마십시오!

이 실제 질문에 대답하기 위해, 나는 당신이 기준과 같이 정의 가정 : 예, 문제가 해결되지 않을 경우

QtLogger& mutable _logger; 

는, 참조 이후 자체가 어쨌든 변경할 수 없습니다. 당신은 너무처럼 mutable를 이동해야합니다

QtLogger mutable& _logger; 

다른 방법으로 _logger을 정의한 경우, 코드를 제시해주십시오.

+0

내 코드 정확히 : 'Logger mutable & _logger;'. gcc가 제공하는 오류를 이해할 수 없습니다. 어쨌든 감사합니다! 나는 당신이 말한 것을 할 것입니다. – Martin

+0

@paps : 이상한 일이지만, 대답의 첫 부분에서 제 제안을 시도하십시오, 아마도 그 문제는 그걸로 이미 해결되었습니다. : P – Xeo

+0

네, 고마워요! (죄송합니다. 회신하는 동안 편집 : p) – Martin

관련 문제