probleme mit QList->at()



  • Hallo

    Ich habe eine Klasse LineOut mit zwei Methoden

    void openFile();
    bool readErrorState() const;
    

    In einer Anderen Stelle habe ich

    LineOut *listLineOut;
    listLineOut = new QList<LineOut>();
    LineOut line("data.txt");
    listLineOut->append(line);
    listLineOut->at(i).openFile()
    if(listLineOut->at(i).readErrorState())
      std::cout << "Huhu" << std::endl;
    else
      std::cout << "Hoho" << std::endl;
    

    beim Kompilieren erhalte ich leider eine Fehlermeldung:

    error: passing ‘const LineOut’ as ‘this’ argument of ‘void LineOut::openFile()’ discards qualifiers
    

    Beim Auskommentieren der Zeile mit dem openFile() funktioniert es.

    Was mache ich falsch? Es scheint als ob das const entscheidend wäre. Allerdings kann ich dies nicht an das openFile() nicht mit einem const versehen. Wie kann ich sonst auf diese Methode zugreifen?



  • LineOut *listLineOut;
    listLineOut = new QList<LineOut>();
    
    // Ist gleichbedeutend zu
    
    LineOut* listLineOut = new QList<LineOut>();
    

    Etwas umgeschrieben sieht mans deutlich: die Zuweisung ist falsch, die Typen passen nicht zusammen. Es sollte wohl heißen:

    QList<LineOut>* listLineOut = new QList<LineOut>();
    


  • sorry, mein Fehler

    QList<LineOut> *listLineOut;
    

    steht ja auch in der header Datei und nicht LineOut *listLineOut; 😞
    Habe ich beim schreiben des Beitrages falsch gemacht.

    in der Cpp Datei steht dann

    listLineOut = new QList<LineOut>();
    


  • Weil die Doku doch klipp und klar sagt, dass es at() nur als const-Version gibt ( const T & at ( int i ) const ).
    Deine Methode LineOut::openFile() ist aber nicht const-qualifiziert, deshalb gibt es die Meldung discards qualifiers .
    Wenn dir ein const T& nicht reicht, musst du halt auf operator[] ausweichen, den gibts als const und als non-const-Version.



  • Kleiner Nachtrag:
    Warum du aber die QList auf dem Heap haben willst, ist mir nicht ganz klar. QList hat sowiso implicit sharing, das heißt Kopien sind verdammt billig, so lange nichts verändert wird. Wenn die Funktion die QList zurückgibt, merkst du gar nichts von einer Kopie.
    Ein einfaches

    QList<LineOut> listLineOut;
    

    reicht völlig. Vor allem gehst du auf Nummer sicher, dass du dir kein Speicherleck einfängst.


Anmelden zum Antworten