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 MethodeLineOut::openFile()
ist aber nicht const-qualifiziert, deshalb gibt es die Meldungdiscards 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 einfachesQList<LineOut> listLineOut;
reicht völlig. Vor allem gehst du auf Nummer sicher, dass du dir kein Speicherleck einfängst.