2010-03-17 5 views
1

나는정렬 개체와 다형성

클래스 A. 있다고 가정 그리고 B와 C는 A의 자녀

클래스 A는 내가 그것을 사용할 수 있도록, A 형의 배열을 정렬에 대한 일반적인 알고리즘을 가지고 B와 C에 대해서 알고리즘을 다시 쓰지 않고.

알고리즘에서 가끔은 교환해야합니다. 문제는 내가 유일한 유형 A와 개체를 볼 수 있다는 것입니다, 그리고 내가 할 경우 :

A aux = array[i] 
array[i] = array[j] 
array[j] = aux 

을 나는 문제가있다 생각합니다. array [i], 아마도 그것의 타입 B, 그리고 aux는 타입 A이므로, 나는 정보를 잃어 가고 있다고 생각합니다.

내가 u는 내가 아버지 방법 알고리즘을 사용하여 개체의 일반적인 배열을 정렬 할 수있는 방법 ...이 상황을 이해 해요?

편집 : 초기 배열은 정적입니다.

Edit2가 : 너무이 불가능 해를 갖도록 : :: 정렬 (A 배열 [])로; 그리고 내가 원하는 것을 할 수 있습니까?, 교환 할 수 없습니다.

유일한 방법은 참조 배열이 있습니까? * 배열 []?

+2

'A'배열이있는 경우 배열은 다형성이 아닙니다. 거기에 정보를 잃지 않고'B' 또는'C'를 넣을 수는 없습니다. 'A *'의 배열을 원한다면, 그 후에 해결책은 간단해야한다. –

+1

타입 A의 값을 저장하는 경우에는 다형성이 없습니다. * 객체 조각화 *가 있습니다. 대신 포인터를 저장하십시오. 그런 다음 비교 함수를 가상화하여 자손을 정렬 할 수 있습니다. –

+0

'A 클래스에는 A 형 배열 정렬을위한 일반 알고리즘이 있습니다.이 클래스에는 많은 책임이 있습니다. 그렇습니까? –

답변

8

다형성 오브젝트 포인터 또는 참조 (또는 포인터 래퍼)로 지칭된다. 포인터를 교환하는 것으로 충분합니다. 사실, 당신은 적절한 조건으로 std::sort 또는 std::stable_sort을 사용할 수 있어야합니다 :

// 'A' defines 'float getSortKey()' 

bool mypred(B* first, B* second) { 
    return first->getSortKey() < second->getSortKey(); 
} 

std::vector<B*> them; 
std::sort(them.begin,them.end(),mypred); 

이 전략은 객체 슬라이스를 방지 할 수 있습니다.

+1

나는 _usually_을 꺼낼 것이다. C++에서 다형성을 갖는 유일한 방법은 포인터 또는 참조를 사용하는 것입니다. – KeithB

+0

고침, 고맙습니다 :-) –

0

@ritmbo는만큼 당신이 다형성 메커니즘에 익숙하지 않은 등의 설명은 알렉산더의 대답 @ 미세 필요합니다.

std::vector<A*>std::vector<A>을 변경해야합니까?

기본 클래스의 개체 컬렉션을 갖고 싶으므로이를 정렬하려면 개체 비교 책임을 A 클래스에서 BC으로 옮겨야합니다. 이렇게하려면 OOP에서 가상 함수를 사용합니다. 객체는 가상 테이블으로 바인딩됩니다. B*A* (으)로 변환하면 A* a = new B;a는 VTABLEnew B에서의 방법에 의해 덮어 쓰기된다. 하지만 BA (으)로 변환하면 A a = B()이면 avtable에 메소드 포인터가 복사되지 않습니다.

길고도 짧은 이야기, 당신은하지 이동 비교 책임 클래스 BC 포인터 사용 (또는 참조를하지만 유지하는 것이 더 어렵다)없이.

0

아이디어가 있습니다. 값으로 저장하려는 경우 '다형성'태그는 오해의 소지가 있습니다. 약 은 에 의해 사용되는 A 클래스 객체의 키 값을 단순히 덮어 쓰는 것이 어떻습니까?

struct A 
{ 
    int key; 
    A(int _key) : key(_key) {} 
    static sort(A array[]); // uses 'key' 
}; 

struct B : public A 
{ 
    B() : A(generate_B_key()) {} 
}; 

struct C : public A 
{ 
    C() : A(generate_C_key()) {} 
};