2016-12-04 9 views
2

멤버 함수를 가진 A 클래스가 있다고 가정합니다. 외부 세계에 f은 단순히 A을 수정하지 않고 값을 계산합니다. 하지만 구현에, 일시적 A을 수정 않습니다const 멤버 함수에서 필드를 임시 수정하기

class A 
{ 
    int f() const 
    { 
     tiny_change(b); // since copying "b" is expensive 
     int result = compute(b); 
     tiny_recover(b); // "b" backs to the original value 
     return result; 
    } 

    B b; 
} 

물론 위의 코드를 컴파일되지 않습니다. 이러한 솔루션의

  1. const_cast<A*>(this)->b
  2. mutable B b;

아무도 완벽하지 : 여기 내가 아는 두 가지 해결 방법이 있습니다. 솔루션 1은 A 인스턴스가 const 일 때 UB를 포함합니다. 솔루션 2는 다른 클래스의 const 멤버 함수에서 실수로 코더가 실수로 b을 수정하는 것을 방지 할 수 없도록 클래스 전체에 가변성을 노출합니다.

const_cast은 "로컬"이지만 UB를 트리거 할 수 있습니다. mutable은 메모리 안전하지만 너무 "전역"입니다.

제 3의 해결책이 있습니까? 아니면 제가 잘못 이해하고 있습니까?

+0

'tiny_change (b)'대신'tiny_change (result)'를 개발하고 변경되지 않은'B'의 결과를 계산할 수 있습니까? – Zereges

+0

"작은 변화"를 취하기 위해'compute'를 오버로드 할 수는 없으며'b' 값이 무엇이든간에 그것을 사용합니까? 'B'는 분명히 비트 단위가 아닌 클래스의 논리적 구조와 관련이 있습니다. 두 솔루션 모두이 경우 해킹입니다. – StoryTeller

+0

@Zereges 그 함수는 내 경우에 동형이 아닙니다. – rolevax

답변

2

하나의 가능성은 그것을 mutable가있는 클래스 B을 캡슐화하는, 그러나 CONST 인 경우 일반적으로 단지 그것을 A::f 친구가하는 것을 제외하고 const 액세스 할 수 있습니다 것입니다. 예를 들면 다음과 같습니다 :