2016-08-03 3 views
1

문제가 있지만 올바르게 해결 한 경우 또는 더 정확한 방법이 있는지 모르겠습니다. 항등 연산자 과부하, I 파생에베이스 객체에 CONST 기준을 전송해야하기파생 된 const 기본 참조 캐스팅

class Data_Base 
{ 
... 
} 

class Data_Error : public Data_Base 
{ 
... 
} 

:

이제 I는 두 클래스 (다른 하나 상속)가 객체를 다시 테스트하여 멤버를 테스트합니다. 현재 나는이 일을 해요 :

이제
bool Data_Error::operator==(const Data_Base &other) const 
{ 
    if (Data_Base::operator !=(other)) 
     return false; 

    const Data_Error &other_cast = (const Data_Error &)other; 

    ... More tests on other_cast ... 
} 

는, 캐스트 순간에 other 변수가 Data_Error 이상의 뭔가가 Data_Base== 연산자 (그리고 != 운영자 이후이라고 가능성이없는,이 구현되어 있기 때문에 ==의 부정으로) 또한 파생 된 객체의 유형을 검사하므로 유형이 올바른 경우에만 해당 행에 도달합니다.

이제이 문제가 있습니까? "더 정확한"해결책이 있습니까?

Qt (5.7)로 작업하고 있으므로 "QTish"솔루션이 더 있습니까?

+0

왜 'Data_Error'를'Data_Base' 자손과 비교합니까? 계층 구조의 여러 분기에서 유형을 비교할 때 어떤 의미가 있습니까? 'bool Data_Error :: operator == (const Data_Error & other) const'를 고수하면됩니다. – StoryTeller

+0

@StoryTeller 기본 유형의 목록이있을 때 항목 중 일부와 동일한 지 확인하기 위해 반복합니다. 나는 단순히 모든 항목에 ==를 부른다. 함수에서 유형이 동일한 지 확인합니다. 그렇지 않으면 유형이 동일하지 않습니다. 그러나이 목적을 위해, 다른 타입은 기본 타입이어야합니다. 그렇지 않으면 프로그램은 두 개의 다른 브랜치를 비교하는 방법을 모릅니다. – frarugi87

+0

'연산자 =='가상입니까? 그렇지 않은 경우 예상대로 작동하지 않습니다. – StoryTeller

답변

1

C 스타일의 캐스트는 피해야합니다. 왜 here을 찾을 수 있습니다. 대신 정적 캐스트를 사용한다 : 다른 런타임에 확인

const Data_Error &other_cast = static_cast<const Data_Error &>(other); 

또는 동적 캐스트 형 Data_Error의 효과적으로입니다 :

const Data_Error &other_cast = dynamic_cast<const Data_Error &>(other); 
+2

이러한 목적을 위해 동적 캐스트가 더 적합합니다. – LmTinyToon

+0

처음 추가했지만 참조가있는 동작이 확실하지 않았습니다. 하지만 당신 말이 맞아요. 제가 읽어 보았습니다. – wasthishelpful

+0

'dynamic_cast' 솔루션이 더 낫습니까? 그렇다면 캐스트가 실패하면 어떻게 될까요? 예외를 던지거나'nullptr'에'other_cast'를 설정합니까? – frarugi87

1

올바른 방법은, 포인터에 dynamic_cast을 사용하는 것입니다 단순히 때문에 객체가 올바른 파생 유형이 아닌 경우 null을 반환합니다. 귀하의 예는 다음과 같습니다 :

bool Data_Error::operator==(const Data_Base &other) const 
{ 
    if (Data_Base::operator !=(other)) 
     return false; 

    const Data_Error *other_cast = dynamic_cast<const Data_Error *>(&other); 
    if (other_cast == nullptr) { // not the correct type 
     return false; 
    } 

    ... More tests on *other_cast ... 
} 
+0

이것이 다른 사람의 "constness"에 영향을 줍니까? – frarugi87

+0

왜 이것을 dynamic_cast로 사용 하시겠습니까? 유형을 이미 알고 있다면 static_cast 할 수 있습니다. "캐스트 된 순간에 다른 변수가 Data_Error가 아닌 다른 것일 가능성은 없습니다" – xaxxon

+0

@ frarugi87 : 아니요. const 대신 const가 const 로의 포인터로 변환됩니다. 그래서 * 꾸밈음 *이 보존됩니다. –

관련 문제