2012-02-15 1 views
7

다형성 유형의 두 인스턴스에 대한 기본 포인터가 있고 참조 된 개체가 동일한 지 결정해야합니다.C++에서 객체 동등성을위한 다형성 유형을 비교하는 관용적 접근법이 있습니까?

현재 나의 방식은 RTTI를 사용하여 유형 평등을 확인하는 것입니다. 유형이 동일하면 virtual is_equivalent 함수를 호출합니다.

더 관용적 인 접근 방법이 있습니까?

파생 클래스 대부분
+1

을 해당 객체가 당신에 따라 무엇입니까? –

+0

대부분의 파생 클래스에서 동등 함은 단순히 멤버 변수가 모두 동일한 값임을 의미합니다. – RandomBits

+0

이 질문은 관련이있을 수 있습니다 : http://stackoverflow.com/questions/1691007/whats-the-right-way-to-overload-operator-for-a-class-hierarchy –

답변

6

는 등가 단순히 멤버 변수 C에

모두 같은 값 ++이 '평등'라고하며 보통 operator==()를 사용하여 구현되는 것을 의미한다.

MyType A; 
MyType B; 
if (A == B) { 
    // do stuff 
} 

그리고 == 전화 사용자가 정의하는 사용자 정의 기능을 가지고 : 당신이 운영자의 의미를 재정의 할 수 있습니다 ++ C에서는 작성할 수 있습니다.

동일한 개체 (즉, 동일한 주소)를 의미하는 동일성을 신원과 구분하려고한다고 생각합니다. 귀하의 경우에는

bool T::operator ==(const T& b) const; 
bool operator ==(const T& a, const T& b); 

당신이 기본 클래스에 대한 operator==을 구현하고자하고 당신이 무엇을하고 있는지 수행

당신은 멤버 함수 또는 (위키 백과에서) 무료 기능으로 구현할 수 있습니다.

더 구체적으로는 다음과 같이 보일 것이다 :

class MyBase 
{ 
    virtual ~MyBase(); // reminder on virtual destructor for RTTI 
    // ... 
private: 
    virtual bool is_equal(const MyBase& other); 

    friend bool operator ==(const MyBase& a, const MyBase& b); 

    // ...  
}; 

bool operator ==(const MyBase& a, const MyBase& b) 
{ 
    // RTTI check 
    if (typeid(a) != typeid(b)) 
     return false; 
    // Invoke is_equal on derived types 
    return a.is_equal(b); 
} 


class D1 : MyBase 
{ 
    virtual bool is_equal(const Base& other) 
    { 
     const D1& other_derived = dynamic_cast<const D1&>(other); 
     // Now compare *this to other_derived 
    } 
}; 

class D2 : MyBase; 
{ }; 


D1 d1; D2 d2; 
bool equal = d1 == d2; // will call your operator and return false since 
         // RTTI will say the types are different 
+0

'operator =='함수에서 가상 함수를 호출하여 두 객체를 비교하고 싶습니다. 비교 함수의 서명은'virtual bool is_equal (MyBase const &)'와 같아야합니다. 이것은 작동하는 것처럼 보이지만 파생 된 객체 유형을 얻기 위해'is_equal'을 구현할 때 명백한 다운 캐스팅이 필요합니다. – RandomBits

+0

예 서명해야합니다. (죄송합니다, 편집) 네, 캐스트가 필요합니다. 'is_equal'은 같은 타입의 객체로 호출해야한다는 것을 지정할 수 있습니다. 비공개로 만들어서'=='만 호출 할 수 있습니다 (이 경우 연산자를 친구로 선언해야합니다). –

+0

편집에서 '친구'부분과 '가상'부분을 잊어 버렸습니다. 나는 그것을 추가했다 (그러나 테스트되지 않았다). –