2014-07-26 4 views
0

빠른 정렬 알고리즘을 구현 중입니다. 나는 인터페이스를인터페이스 자체가 매개 변수로 사용되는 C++ 순수 가상 메서드

class Comparable{ 
public: 
    virtual int compareTo(Comparable *c)=0; 
}; 

이 지금은 Comparable를 구현 ComparableInt라는 클래스가이 그것을 할 올바른 방법입니다,

class ComparableInt: public algorithm::Comparable{ 
public: 
    int value; 
    int compareTo(Comparable *i) { 
     ComparableInt *c = dynamic_cast<ComparableInt*>(i); 
     return value - (*c).value; 
    }; 
    ComparableInt(int i):value(i){}; 
}; 

내 질문이 있습니까? 나는 이런 식으로 구현하려고했다 :

class ComparableInt: public algorithm::Comparable{ 
public: 
    int value; 
    int compareTo(ComparableInt *i) { 
     return value - (*i).value; 
    }; 
    ComparableInt(int i):value(i){}; 
}; 

하지만이 INT은 compareTo (ComparableInt은 * 내가) 가상 INT은 compareTo (Comparable를 *의 C)에 대한 실현하는 것이 아닌 것 같다, 그래서 동적 캐스팅을 할 필요가 . 당신의 친절한 도움을 구하는!

+1

방법 "STL의 정신"는 퀵의 모든 호출 대상을 단지 두 개의 요소를 호출하는 것입니다 수행합니다. – chris

+2

상속을 사용하여 분류를 구현하는 이유는 무엇입니까? 템플릿과 표준 라이브러리를 사용하여이를 수행하는 방법에 대한 아이디어는 [here] (http://stackoverflow.com/questions/24650626/how-to-implement-classic-sorting-algorithms-in-modern-c)에서 확인하십시오. 알고리즘. – Praetorian

+0

이 디자인의 문제점은 실제로 서로 비교할 수있는 것들을 비교하고 있다는 것을 실제로 제어 할 수 없다는 것입니다. 그들은 실제로 동일한 파생 형식을 가져야하며 동일한 인터페이스 유형이 아니어야합니다. – jxh

답변

0

이 시도 :

template<typename T> 
class Comparable 
{ 
public: 
    virtual int compareTo(Comparable<T> *c) = 0; 
    virtual T getValue() = 0; 
}; 

class ComparableInt: public algorithm::Comparable<int> 
{ 
public: 
    int value; 
    int compareTo(Comparable<int> *i) 
    { 
     return value - i->getValue(); 
    }; 
    int getValue() { return value; } 
    ComparableInt(int i):value(i){}; 
}; 
+0

우리가 가상 함수 도로를 내려가고 있다면, 그것을 템플릿으로 정의하겠다. 클래스 Comparable {public : virtual int compareTo (T * c) = 0; }; ComparableInt : 공용 알고리즘 :: Comparable {/*...*/};' –

관련 문제