문제

간단한 비교를 위해 ==, <,> 및! = 연산자를 과부하시키는 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()
}

내 마음에 이것은 코드를 더 명확하게 만듭니다 (그러나 이것은 다시 당신의 취향이 다를 수있는 의견입니다)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top