2013-11-01 3 views
5

일부 변수에 대해 몇 가지 검사를 수행하고 값을 반환하는 메서드가있는 클래스가 있습니다. 결과적으로 경고 메시지가 인쇄됩니다. 메소드가 클래스 변수를 변경하지 않기 때문에 const로 정의했습니다. 그러나 홍수 출력을 피하기 위해 몇 가지 (또는 단지 하나) 인쇄 후에 경고 인쇄를 억제하고 싶습니다. 메서드를 const로 유지하는 솔루션을 찾을 수 없었습니다. 그게 가능합니까 (쉬운)?const 메서드의 메시지 출력을 표시하지 않습니다.

+0

함수의 로컬 카운터를 정적 변수로 정의 할 수 있습니다. –

답변

8

사용 방법 mutable 카운터 사용 하시겠습니까? 그것이 객체의 상태가 아니기 때문에 받아 들여야한다고 생각합니다. 그것은 내부 논리 상태입니다. 이

class Printer 
{ 
public: 
    Printer() : counter(0) {} 
    void output() const 
    { 
     if (counter++ < max_warnings) 
     { 
     std::cout << "Something special" << std::endl; 
     } 
    } 
private: 
    static const size_t max_warnings = 5; 
    mutable size_t counter; 
}; 

Live example

당신은 (영원히에서 카운터 예를 고수 할 수

class Printer 
{ 
public: 
    Printer() : counter(0) {} 
    void output() const 
    { 
     if (counter++ < max_warnings) 
     { 
     std::cout << "Something special" << std::endl; 
     } 
    } 
private: 
    static const size_t max_warnings = 5; 
    mutable std::atomic<size_t> counter; 
}; 
+3

+1 그러나 멀티 스레딩 문제가 발생하지 않도록해야합니다. 메소드가'const'로 표시되면, 사용자는 보통 MT- 안전성을 기대하기 때문에 대신 원자 카운터를 사용하는 것이 좋습니다. –

+0

@DanielFrey 당신 말이 맞습니다,하지만 제 생각에는이 예제에서는 초과했습니다. – ForEveR

+0

오류 감추기 @DanielFrey 나는 작은 경쟁 조건을 인정할 수 있었지만 물론 더 섬세한 상황에서도 원 자성을 추가해야했다. – DarioP

0

원자 카운터 멀티 스레딩 예에 대해 많은 의견이 있기 때문에 같은

뭔가)

  • , 당신은 질문에 코드를 추가 할이 객체 솔루션은 실제 문제가 당신에 따라 달라집니다

에없는 카운터 등의 변수를 사용 const_cast<int>(counter)

  • 를 통해 멀리 const 캐스팅?

  • +0

    나는 디자인 상 const_cast를 피할 것이고 카운터는 모든 인스턴스가 특정 카운터를 가져야하므로 객체에 있어야합니다. 나는이 사건이 매우 잘 맞는 것이라고 생각한다. 코드 조각은 ForEveR의 대답을 참조하십시오. 그는 정확히 요점을 가지고 있습니다. – DarioP

    +0

    @DarioP : 그게 내가 코드 스 니펫을 요청한 이유입니다. :) 그러나 질문 제목은이 열림을 남기므로 내 제안은 다른 사람들에게 옵션이 될 수 있습니다.그리고 _suppress messages_라는 단어는 컴파일러 경고에 맞서 싸우는 것처럼 보였습니다 ... – Wolf

    +0

    ... 그래서 나는 아직 승인되지 않았을 수도있는 귀하의 질문을 편집했습니다. – Wolf

    관련 문제