qSort bzw. QT Container und Generisches Sortieren



  • Hallo,

    ich möchte eine QT Containerklasse "generisch" sortieren.

    mit qSort() kann man ja einiges machen, aber ich weiß nicht, wie ich da meine eigene Vergleichsmethode mitgeben kann:

    class ICompareable {
    public:
        virtual bool compare(const A*, const A*) = 0;
    };
    
    class ConcreteCompare : public ICompareable {
    public:
        bool compare(const A*, const A*) {
            cout << "concrete compare" << endl;
            return false;
        }
    };
    
    void someFunctionSomeWhere() {
       QVector<A*> list;
       list.pushBack(...);
    
    // !!!!das geht aber nicht :(!!!
       ICompareable *cmp = getConcreteCompareMethod();
       qSort(list.begin(), list.end(), comp->compare);
    }
    

    danke im Voraus!



  • WAS geht daran nicht?
    Fehlermeldungen? Absturz?

    Ich schätze mal, dass du deine Methode static machen musst, dann kannst du aber nich mehr polymorph drauf zugreifen. warum nimmst du nicht std::vector und std::sort?



  • Wenn du unbedingt dein "ICompareable" benutzen möchtest:

    // untested!
    
    class DoCompare
    {
        ICompareable* cmp;
    
    public:
         DoCompare(ICompareable* cmp) : cmp(cmp) { }
         bool operator()(const A* lhs, const B* rhs)
         {
             return cmp->compare(lhs, rhs);
         }
    };
    
    QVector<A*> list;
    list.pushBack(...);
    
    ICompareable *cmp = getConcreteCompareMethod();
    qSort(list.begin(), list.end(), DoCompare(comp));
    

    Ob das alles sonderlich "generisch" ist, bezweifle ich aber.


Anmelden zum Antworten