2009-11-06 5 views
0

STL 정렬 기능으로 파생 클래스를 정렬하는 데 문제가 있습니다.STL 추상 클래스로 정렬

예 -

헤더 다음 IMPL에서

vector<AbstractBaseClass *> *myVector; 

:

sort(myVector->begin(), myVector->end(), compareBy); 

비교기 :

bool MyClass::compareBy(AbstractBaseClass& a, AbstractBaseClass& b) { 
    return (a->someMethod() < b->someMethod()); 
} 

편집 :이 질문은 일반적인 사용으로 설치된다 정렬의 STL과 추상 클래스 (나는 추적 덤프를 게시하지 않는다). 그것의 명백하지 않은 경우에, 나는 지옥에 그것이 인쇄 된대로 컴파일 할 수있는 방법이 없다고 말할 것이다. 오히려, 저는이 장난감 추상 클래스로 어떻게 전형적으로 정렬 할 것인지 (데이터 구조가 주어짐) 묻습니다.

빠른 답변 주셔서 감사합니다, 당신들이 이미 nail'd 그것을 믿습니다!

좋아요. 스택 오버플로!

+1

실제 코드를 입력하십시오. 벡터는 무엇을 유지합니까? 어떻게 정의됩니까? 문제가 무엇입니까? 컴파일 오류, 링커 오류, 예상하지 못한 출력? – GManNickG

+0

그리고 ... * 어떤 종류의 문제가 있습니까? – Christian

+0

내 충고 - bool MyClass :: compareBy() 안에 중단 점을 설정하고 확인하십시오. –

답변

7

예 :

struct Abstr { 
    virtual int some()const == 0; 
    virtual ~Abstr() = default; 
}; 

bool abstrSmaller(const Abstr* a1, const Abstr* a2) { 
    return a1->some() < a2->some(); 
} 

int main() { 
    vector<Abstr*> v; 

    sort(v.begin(), v.end(), abstrSmaller); 
} 
  1. 멤버 함수이어야한다 비교 함수 : static 중 하나 또는 무료 기능.
  2. vector의 요소를 인수로 취해야합니다. 즉 포인터가 아닌 참조입니다.
  3. const 함수를 호출 할 수 있으므로 const 인수를 사용할 수 있습니다.
+0

빠른 응답을위한 완벽한, 감사합니다 xtofl! – Rev316

4
  1. compareBy 비 정적 멤버 함수 (이것은 내재 this 포인터가 필요할 것이기 때문에 컴파일러가 함수에 전달되는)을되어야 함. 정적 멤버, 자유 함수 또는 함수 개체로 만들 수 있습니다. 일반적으로 더 나은 최적화가 가능하기 때문에 일반적으로 후자가 더 좋습니다 (코드에서 추상화 패널티가이를 취소 할 수도 있음).
  2. 비교는 벡터의 value_type이어야하며 그 값은 AbstractBaseClass&이 아니라 AbstractBaseClass*입니다.

    struct compareBy : public std::binary_function< const AbstractBaseClass* 
                   , const AbstractBaseClass* 
                   , bool > { 
        bool operator()(const AbstractBaseClass* a, const AbstractBaseClass* b) { 
        return (a->someMethod() < b->someMethod()); 
        } 
    }; 
    

    당신은이 비교기 클래스의 private 멤버 만들 수 있으므로 어떤 이름 공간을 오염하지 않습니다

이 다음과 같을 것이다.

+0

완벽을 기하기 위해'binary_function'에서 상속 받고 싶습니다. – GManNickG

+0

@GMan : 좋은 생각! 끝난. – sbi

관련 문제