nicht statische Methode mit Algorithmus verbinden



  • Hallo,

    mal ne frage images/smiles/icon_biggrin.gif
    ich verwende den qsort von VC++ und da muß man doch auch so ne compare funktion angeben...
    soweit kein problem aber...
    wenn ich das aus ner klasse machen will muß ich ja quasi auch diese compare funktion in die klasse integrieren (wenn ichs global anleg haut alles wunderbar hin, aber so will ich das nicht lassen)
    ich krieg dabei aber immer nen fehler von wegen int irgendwas kann nicht in int __cdecl irgendwas umgewandelt werden images/smiles/icon_confused.gif
    wie mach ich das richtig...
    danke

    [ Dieser Beitrag wurde am 03.12.2001 um 01:06 Uhr von HumeSikkins editiert. ]



  • Hallo,
    du kannst an qsort keine nicht-statische Methode übergeben.
    qsort erwartet eine Funktion des Typs:
    int (*compare)(const void *elem1, const void *elem2 )

    Eine solche nicht-statische Methode einer Klasse X hat aber den Typ
    int (X::*compare)(const void* elem1, const void* elem2)

    Es gibt keine legale Konvertierung zwischen einer nicht-statischen Methode und einer normalen Funktion.

    Du mußt also eine statische Methode verwenden. Sinnvoller wäre es aber einfach den Algorithmus sort aus <algorithm> zu verwenden.



  • Aber könnte das nicht mit nem Elementfunktionsadapter gehen?

    mem_fun_ref(&X::Funktion)



  • Die Algorithmen aus <algorithm> nehmen ja auch keine Methoden sondern nur Nicht-Klassen-Funktionen. Mit qsort() ist das doch genauso.

    Um jetzt trotzdem Member-Funktionen nehmen zu können gibt es die Elementsfunktionsadapter.

    Ein Elementfunktionsadapter ist ein Klassentemplate, der Du eine Funktion der Klasse, auf die du die Klasse typisierst, übergibst, und deren ()-operator so überladen ist, dass er diese Funktion aufruft. (diese Funktion darf nicht mehr als einen Parameter benötigen, sonst brauchst Du wiederum Binder und Funktionszeigeradapter images/smiles/icon_biggrin.gif images/smiles/icon_biggrin.gif images/smiles/icon_biggrin.gif)

    Is aber eigentlich nicht so kompliziert, wie es sich anhört, nur Deine Code-Zeilen werden immer länger ....

    Hier http://www.roguewave.com/support/docs/SourcePro/stdlibref/mem-fun.cfm findest Du eine Beschreibung zu Elementfunktionsadaptern.

    Da ist auch ein Beispiel. Beachte nur, dass die funktion sort() von std::list, eine memberfunktion ist, im gegensatz zu den ganzen anderen sortierfunktionen aus algorithm. Sie wird über einen Funktionszeigeradapter aufgerufen.



  • Hallo,
    mit sort ginge es z.B. so:

    #include <iostream>
    #include <algorithm>
    #include <functional>
    using namespace std;
    
    class X
    {
        int x;
        public:
            X(int i = 0) : x(i) {}
            int Compare( const X& re) const
            {
                return x > re.x;
            }
            bool Test()
            {
                return true;
            }
    };
    int main()
    {
        X Array[10];
        for (int i = 0; i <10 ; i++)
            Array[i] = i;
        sort(Array, Array+10, mem_fun1_ref(&X::Compare));
    }
    

    Beim VC darf Compare übrigens keine const-Methode sein.


Anmelden zum Antworten