다형성 유형의 두 인스턴스에 대한 기본 포인터가 있고 참조 된 개체가 동일한 지 결정해야합니다.C++에서 객체 동등성을위한 다형성 유형을 비교하는 관용적 접근법이 있습니까?
현재 나의 방식은 RTTI를 사용하여 유형 평등을 확인하는 것입니다. 유형이 동일하면 virtual is_equivalent 함수를 호출합니다.
더 관용적 인 접근 방법이 있습니까?
파생 클래스 대부분다형성 유형의 두 인스턴스에 대한 기본 포인터가 있고 참조 된 개체가 동일한 지 결정해야합니다.C++에서 객체 동등성을위한 다형성 유형을 비교하는 관용적 접근법이 있습니까?
현재 나의 방식은 RTTI를 사용하여 유형 평등을 확인하는 것입니다. 유형이 동일하면 virtual is_equivalent 함수를 호출합니다.
더 관용적 인 접근 방법이 있습니까?
파생 클래스 대부분는 등가 단순히 멤버 변수 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
'operator =='함수에서 가상 함수를 호출하여 두 객체를 비교하고 싶습니다. 비교 함수의 서명은'virtual bool is_equal (MyBase const &)'와 같아야합니다. 이것은 작동하는 것처럼 보이지만 파생 된 객체 유형을 얻기 위해'is_equal'을 구현할 때 명백한 다운 캐스팅이 필요합니다. – RandomBits
예 서명해야합니다. (죄송합니다, 편집) 네, 캐스트가 필요합니다. 'is_equal'은 같은 타입의 객체로 호출해야한다는 것을 지정할 수 있습니다. 비공개로 만들어서'=='만 호출 할 수 있습니다 (이 경우 연산자를 친구로 선언해야합니다). –
편집에서 '친구'부분과 '가상'부분을 잊어 버렸습니다. 나는 그것을 추가했다 (그러나 테스트되지 않았다). –
을 해당 객체가 당신에 따라 무엇입니까? –
대부분의 파생 클래스에서 동등 함은 단순히 멤버 변수가 모두 동일한 값임을 의미합니다. – RandomBits
이 질문은 관련이있을 수 있습니다 : http://stackoverflow.com/questions/1691007/whats-the-right-way-to-overload-operator-for-a-class-hierarchy –