2011-02-15 6 views
18

CONST 기능 (C++) 내에서 const가 아닌 함수를 호출하는 방법 :I는 다음과 같습니다 레거시 기능이

int Random() const 
{ 
    return var_ ? 4 : 0; 
} 

을하고 난 그래서 지금 레거시 코드 내에서 함수를 호출 할 필요가 다음과 같습니다 생를 해결하기 위해 지금

In member function 'virtual int Random() const': 
class.cc:145: error: passing 'const int' as 'this' argument of 'int newCall(int)' discards qualifiers 

내가 아는 :

int Random() const 
{ 
    return var_ ? newCall(4) : 0; 
} 

문제는 내가이 오류를 얻고 있다는 것입니다 s error 내 newCall()을 const 함수로 만들 수있다. 그런데 내가 만든 newCall()에 몇 가지 funciton 호출이 있습니다. 그래서 이제는 모든 함수 호출을 const로 만들어야 할 것입니다. 그리고 결국에는 내 프로그램이 const가 될 것이라고 생각할 때까지 계속됩니다.

내 질문 : Random() 내에서 const가 아닌 함수를 호출하는 방법이 있습니까? 또는 누군가 내 프로그램 const를 반 만들지 않고 newCall()Random() 내에 구현하는 방법에 대한 아이디어가 있습니까? 당신은 새 통화가 "이"을 수정하지 않습니다 확신하는 경우

+0

Random()을 const가 아닌 것으로 만들 수 있습니다. – GWW

+0

Random()은 내가 만질 수없는 레거시 코드입니다. – Grammin

+1

4가 공평하지 않은 주사위로 선택 되었습니까 (따라서 실제로는 무작위로 지정됩니다). –

답변

17

당신 해야

하나의 대안이에 const_cast를 사용하는 것입니다 .../사용 제대로을 const 선언하는 프로그램을 변경합니다.

+2

+1 : 가능한 경우 모든 종속 함수를 'const'로 만듭니다. –

+5

const_cast를 잘못 사용하면 (듣고있는 것입니다) 완전한 재앙이 발생합니다. –

+3

조언을 주셔서 감사합니다. 나는 const를 잘못 사용하고 싶지 않았기 때문에 newCall() 및 newCall() 아래의 함수를 모두 const로 변경했습니다. – Grammin

0
const_cast<MyClass *>(this)->newCall(4) 

만이 작업을 수행 -josh

감사

.

12

하지만 좋은 생각은 아닙니다. 가능하면 피하십시오!

+1

@Downvoter : 왜 downvote를 설명해 주시겠습니까? – Nawaz

+0

당신이 말했듯이, 당신이 정말로 이것을 성취하기 위해'const_cast'를 사용해야한다면, 당신의 디자인을 리팩터링하십시오. – thatWiseGuy

0

const 캐스트를 사용하지 않으면 Random() 메서드에서 클래스의 새 인스턴스를 만들 수 있습니까?

0

한정자 const 한정자는 클래스의 인스턴스 this이 작동 후 변경되지 않는다고 주장합니다. 컴파일러가 자동으로 추측 할 수없는 내용입니다.

const_cast 사용하지만, 수의 악

여기에 두 가지 가능성이 있습니다
1

. 첫째, newCall이고 모든 피 호출자는 사실 수정 기능이 아닙니다. 이 경우 절대적으로 통과하여 모두 const으로 표시해야합니다. 여러분과 미래의 코드 관리자는 모두 코드를 더 쉽게 읽을 수 있도록 해주셔서 감사합니다. 둘째로, newCall은 실제로 개체의 상태를 변경합니다 (호출하는 함수 중 하나를 통해 가능). 이 경우 API를 깨고 Random non-const를 호출자에게 올바르게 지정하여 객체 상태를 수정해야합니다 (수정이 물리적 constness에만 영향을 미치고 논리적 const가 아니라면 변경 가능한 속성을 사용하고 const을 전파 할 수 있음).

0

정말 난수 생성기이면 숫자 생성 코드/상태는 클래스 로컬 정적 생성기에 배치 될 수 있습니다. 이 방법은 개체가 변경되지 않고 메서드가 const 상태로 유지 될 수 있습니다.

+0

그것은 난수 생성기가 아니며 단지 예제가 필요했습니다. 그래도 감사합니다 – Grammin

관련 문제