C ++에서 중첩 작업자 과부하를 사용할 때 컴파일러 오류
-
06-07-2019 - |
문제
간단한 비교를 위해 ==, <,> 및! = 연산자를 과부하시키는 URL 클래스가 있습니다. URL 클래스에는 문자열 데이터 멤버가 있고 일부 기능은 문자열에서 작동합니다. URL 클래스로 테스트 할 때 연산자는 정상적으로 작동합니다.
또한 URL 데이터 멤버가있는 페이지 클래스도 있습니다. 페이지 클래스에서 동일한 연산자에게 과부하를 주려고합니다. 페이지 클래스의 평등은 해당 URL의 동등성을 기반으로하므로 페이지를 비교하는 데 URL 클래스 부울 연산자를 사용합니다. 이로 인해 알아낼 수없는 컴파일러 오류가 발생합니다. URL 연산자 코드 :
bool URL::operator ==(URL & u) const {
//url is the string instance variable
return url == u.GetURL();
}
페이지 운영자 코드 :
bool Page::operator ==(Page & p) const {
//url is the URL instance variable of the Page class
return url == p.GetURL();
}
이것은와 같은 오류를 생성합니다.
src/Page.cpp: In member function ‘bool Page::operator==(Page&) const’:
src/Page.cpp:21: error: no match for ‘operator==’ in ‘((const Page*)this)->Page::url == Page::GetURL()()’
inc/URL.h:118: note: candidates are: bool URL::operator==(URL&) const
나는 그것이 내가 잊고있는 바보라고 예측한다. 당신은 나를 옳게 증명할 것입니까?
편집하다: Const 정확성은 나를 부랑자에 물었습니다. 도와 주셔서 감사합니다.
해결책
그것은 다음과 같았어야했을 것입니다.
bool URL::operator ==(const URL & u) const {
//url is the string instance variable
return url == u.GetURL();
}
다른 운영자와 유사하게.
여전히 컴파일러 오류가 발생하면 아마도 만들지 않았을 것입니다. GetURL()
Const :
std:string URL::GetURL() const {
// whatever...
}
다른 팁
또한 방법 (예 : 공개 인터페이스)이 구현 세부 사항의 변경으로부터 외부 엔티티를 보호하기위한 방법이 있음을 지적하고 싶습니다. 또한 수업은 자동으로 그 자체의 친구 (같은 이유로)이므로 다른 객체의 멤버에 액세스하는 것만으로도 괜찮습니다.
bool URL::operator ==(URL & u) const {
//url is the string instance variable
return url == u.GetURL();
}
다음과 같이 쓸 수 있습니다.
bool URL::operator ==(URL & rhs) const
{
return url == rhs.url; // No need to use GetURL()
}
내 마음에 이것은 코드를 더 명확하게 만듭니다 (그러나 이것은 다시 당신의 취향이 다를 수있는 의견입니다)