Objekt aus QList löschen.



  • Hallo zusammen,

    Ich will gerade ein Objekt aus einer QList löschen.
    Leider bekomne ucg ständig die Fehlermeldung: instantiated from here.

    Leider bringt mir das rein gar nichts, da ich keine Ahnung habe warum dies Auftritt.

    myList.removeOne(Despawn(buffer));
    

    myList ist eine QList vom Typ 'myObject'.
    Despawn - als parameter kommt ein byte array rein - gibt ein objekt vom typ 'myObject' zurück.

    Warum will das ganze nicht gelöscht werden?

    Grz



  • Guest123 schrieb:

    Leider bekomne ucg ständig die Fehlermeldung: instantiated from here.

    Leider bringt mir das rein gar nichts,

    Und uns bringt das leider auch nicht weiter.
    😉 Du postest einen kleinen Ausschnitt aus der gesamten Fehlermeldung, der absolut nichtssagend ist.
    😉 Du gibsts uns keinen wirklich relevanten Code.
    😉 Deine Beschreibung, wie dein Code "funktioniert" bringt gar nichts.

    Lösung:
    Poste ein komplettes Codebeispiel. Reduziere dieses aufs Nötigste (keinen unnötigen Ballast wie Events, komplexe Widget-Layouts, Programm-Logik, ...). Einfach minimal eine main, eine Liste, die Objekte deiner Klasse hält, deine KLasse, die du auch im Programm in der Liste speichern willst, in der main fügst du Elemente in die Liste und versuchst eines zu löschen. Achte bitte darauf, dass dein Fehler auch auftritt. Ein funktionierendes Programm bringt nichts wenn man einen Fehler lösen will 😛



  • Alsooo 🙂

    struct myObject{
            const char* myString;
            int myNumber;
        };
    
    QList<myObject> myList;
    
    myObject Despawn(unsigned char data[]){
            myObject mobj;
            mobj.myNumber = 9;
            mobj.myString = "asdf";
    
            return mobj;
        }
    

    Das sind die 3 'elementaren' Dinge. 🙂
    Der Inhalt von Despawn ist nur zum Test da..
    Ein richtiges Objekt suchen und dann zurückgeben kommt später rein. 😉

    Hilft euch das schon weiter?

    grz

    PS:
    Genau Fehlermeldungen wie sie 1:1 in der IDE stehen:

    'instantiated from bool QList<T>::removeOne(const T&) [with T = myObject]' (qlist.h)
    'instantiated from here' (testfile.cpp)
    'no match for 'operator==' in n->QList<T>::Node::t [with T = myObject]() == t'



  • Sehr schön, damit kann man arbeiten 🙂
    Schau dir die Doku zu QList::removeOne() GENAU an. Da steht:

    This function requires the value type to have an implementation of operator==().

    Das bedeutet, dass du dir für dein "struct myObject" den operator== überladen musst.
    Lies dir dazu diesen Artikel durch. Pass aber auf: du hast einen Member "const char*", den kannst du nicht mit "==" vergleichen. Wenn du keinen Grund hast solltest du hier gleich std::string (oder gleich QString, bist ja mit Qt unterwegs) verwenden, ist einfach bequemer 😛



  • Hoi,

    Danke vielmals!

    bool operator==(myObject const& lhs);  //operator!= analog
    

    das ganze sieht jetzt folgendermassen aus.

    Laut compiler darf ich nur 1 Argument in den Parameter schreiben (myObject const& lhs, myObject const& rhs - wie in dem Artikel beschrieben) geht also nicht.

    Ist das richtig so?
    Das entfernen des Objekts aus der Liste funktioniert nun wie gewünscht.

    grz



  • Guest1234 schrieb:

    Laut compiler darf ich nur 1 Argument in den Parameter schreiben (myObject const& lhs, myObject const& rhs - wie in dem Artikel beschrieben) geht also nicht.

    Ist das richtig so?

    Nein. Du hast dir den Text nicht genau durchgelesen. Da steht:

    Wegen möglicher impliziter Konvertierungen des ersten Arguments werden die Operatoren als freie Funktionen definiert, die Argumente bleiben unverändert.

    Es ist möglich, den operator== als Member-Funktion zu implementieren. Dann solltest du aber bitte die Funktion "const" machen. Aber (wie der Artikel auch sagt) solltest du den operator== als freie Funktion überladen.



  • Ok merci viel mal 😉


Anmelden zum Antworten