2012-12-17 3 views
0

순수 가상 메서드가있는 "Parent"추상 클래스와이 메서드와 멤버 "value"를 구현하는 자식 클래스 "Child"가 있습니다. 동적 클래스의 수단으로 shared_ptr이라는 자식 클래스의 객체를 인스턴스화합니다. 나는이 객체들을 std :: vector에 저장하기 때문에 shared_ptr을 참조 대신 여기에 사용한다.shared_ptr을 사용하는 추상 기본 클래스의 자식에 대한 C++ == 연산자

이제 "someObject"와 "anotherObject"두 개 객체를 내 소스 코드 하단에 정의 된 것과 비교하고 싶습니다. 따라서 해당 Child 클래스에서 == 연산자를 덮어 썼습니다. 그럼에도 불구하고 shared_ptr의 == 연산자 만 호출됩니다. 동적으로 바인드 된 객체를 전혀 비교할 수 있습니까?

/* 
* Parent.h 
*/ 
class Parent{ 
public: 
    virtual ~Parent(){}; 
    virtual void someFunction() = 0; 
}; 


/* 
* Child.h 
*/ 
class Child : public Base{ 
private: 
    short value; 

public: 
    Child(short value); 
    virtual ~Child(); 
    bool operator==(const Child &other) const; 
    void someFunction(); 
}; 


/* 
* Child.cpp 
*/ 
#include "Child.h" 

Child::Child(short value):value(value){} 
Child::~Child() {} 
void Child::someFunction(){...} 

bool Child::operator==(const Child &other) const { 
    if(this->value==other.value){ 
     return true; 
    } 
    return false; 
} 


/* 
* Some Method 
*/ 
std::shared_ptr<Parent> someObject(new Child(3)); 
std::shared_ptr<Parent> anotherObject(new Child(4)); 
//!!!calls == operator for shared_ptr, but not for Child 
if(someObject==anotherObject){ 
//do sth 
} 

여기에 입력 해 주셔서 감사합니다! 고맙습니다. 정적으로 알려진 유형 (그리고 그것이) Parent 경우

최저

,

+1

일반적으로 다형성 클래스를 비교하지 마십시오. 사실, 한 번에 하나 이상의 다형성 객체를 사용하여 아무것도 수행하지 마십시오. –

답변

2

Alf suggestedif 문을 변경하여 포인터가 아닌 개체 자체를 비교해야합니다.

또한 이들이 동일한 지 확인하기 위해 특별한 처리가 필요한 하위 유형이있는 경우 operator==은 실제 비교를 수행하기 위해 가상 함수를 연기해야합니다.

bool Parent::operator==(const Parent& other) const 
{ 
    return equals(other); 
} 

bool Child::equals(const Parent& other) const 
{ 
    Child * otherChild = dynamic_cast<Child*>(&other); 
    if (otherChild != NULL) 
     // compare child to child 
    else 
     // compare child to other type 
} 
+0

아이를 다른 유형과 비교하는 대신, 단순히 그 경우에 대해 false를 반환 할 수 있습니다. (어쩌면 명확성을 위해 코멘트를 남김) –

+0

@MooingDuck, 대부분의 시간은 옳을 것입니다.하지만 "평등"을 정의하는 방법에 달려 있습니다. 예를 들어 키 필드를 사용하여 동등성을 판단 할 수 있습니다. –

+0

@ MarkRansom : 고마워, 그게 나를 위해 일했다. other가 const이기 때문에 여기에 표시된 것처럼 dynamic_cast const도 만들어야했습니다. http://stackoverflow.com/questions/3605679/cast-const-class-using-dynamic-cast. 한 가지 질문이 남아 있습니다. 왜 가상 함수를 전혀 사용하지 않을 수 있습니까? 추상 클래스가 순수 가상이되는 것을 피하려면? – Chris

5

, 당신은 operator==Parent에 정의되어 있어야합니다.

클래스 Parent 가상 여부 일부 operator==을 가지고 가상 operator==을 가지고 있지만, 가정에 문제가, 다음

std::shared_ptr<Parent> someObject(new Child(3)); 
std::shared_ptr<Parent> anotherObject(new Child(4)); 

//calls == operator for Parent 
if(*someObject == *anotherObject){ 
//do sth 
} 
역 참조 *의없이

(또는 동급) 할 수있다는 것 발견 한대로 shared_ptr 인스턴스를 비교하면됩니다.

+0

역 참조 문제를 지적 해 주셔서 감사합니다. 불행히도 파생 된 클래스에 대해 == 연산자를 구현하는 것이 주요 문제였습니다. – Chris

관련 문제