2010-07-15 4 views

답변

11

C :: func() 메서드는 개체를 수정하지 않는다고 약속하지 않으며 인수를 수정하지 않는다고 약속합니다. 수정 :

void func(const C &obj) const 
    { 
     // don't change any this members or the compiler complains 
    } 

또는 정적 기능으로 만듭니다. 어떤 확실한 소리는 C 객체를 인자로 취할 때와 같아야합니다.

+0

좋은 답변입니다. 점을 더 명확하게하려고 노력한다 :'func2'는'const C '(즉'const C'에 대한 참조)를 취하기 때문에 함수가이 객체 인스턴스를 수정할 수 없다는 것을 의미한다. 이 제약 조건은 호출 된 멤버 함수'C :: func'에 전달됩니다. 객체 인스턴스를 수정하지 않아야합니다. 따라서 선언에 필요한'const'. – stakx

+0

그래, 왜 C &로 변환 할 수 없다고 말하는거야? – Drew

+0

큰 오류 메시지는 아닙니다. 내 컴파일러는 "이 '포인터를'const C '에서'C & '로 변환 할 수 없다고 말합니다. 어떤 상을 수상하지는 못하지만 const의 정확성 문제가 문제임을 분명히합니다. –

2

const 오브젝트에서 호출 할 때 C::func(const C &obj)을 const로 표시해야합니다. 올바른 서명은 다음과 같을 것이다 :

void func(const C& obj) const 
1

문제는 func2()에 당신이 CONST 개체를 사용하여 const가 아닌 함수 (C::func())를 호출하고 있다는 점이다.

변경 C::func()의 서명 :

void func(const C &obj) const 
{ 
    // whatever... 
} 

그것은 const를 객체로 호출 할 수 있습니다 그래서.

1

때문에 :

this 

현재 OBJ에 const를 포인터이다.

class C 
{ 
public: 
    void func(const C &obj) const 
    { 
     //body 
    } 

private: 
    int x; 
}; 

void func2(const C &obj) 
{ 
    obj.func(obj); 
} 

int main() { 
return 0; 
} 

또는

이 같은 포인터의 const와 제거 할 수 있습니다 :

따라서 당신은 FUNC가 const를 할 수 있도록 할 수 있습니다

class C 
{ 
public: 
    void func(const C &obj) 
    { 
     //body 
    } 

private: 
    int x; 
}; 

void func2(const C &obj) 
{ 
    (const_cast<C &>(obj)).func(obj); 
} 

int main() { 
return 0; 
} 

희망을 그 도움이됩니다.

관련 문제