Qt: QList, Indexoperator und Pointerzugriff
-
Hallo,
Ich habe ein Demo geschrieben (s.u.) um mein(e) Problem(e) mit einem QList Objekt zu verdeutlichen. Allerdings habe ich dieselben Probleme, wenn ich stattdessen einen QVector hernehme - weshalb ich vermute, dass es eher grundsaetzliche C++ Verstaendnisschwierigkeiten sind, vllt kann mir ja jemand mal ein paar Tipps geben.
Also...
1. Wenn ich die einzelnen Listenelemente abfragen will, sollte das eig per Indexoperator [] gehen, allerdings meckert hier mein Compiler (gcc), dass das Objekt "list" die Attribute "sz1" und "sz2" nicht kennt. Kein Wunder, es sollten ja auch die Attribute von "list[0]" sein und nicht von "list", warum wird das "[0]" hier einfach ignoriert? Was mache ich falsch?2. Eigentlich wollte ich ja per Pointer auf die Attribute der Elemente zugreifen, nun meint aber mein Compiler wieder, dass das fuer ihn kein Pointertype ist und ich deshalb nicht per '->' sondern per '.' auf etwaige Attribute zugreifen soll (deshalb sieht der Code so aus, wie er aussieht). Warum ist das hier nicht '->'?
// QList test #include <QApplication> #include <QList> #include <iostream> struct Element { QString sz1; QString sz2; }; int main() { std::cout << "main started\n"; std::cout << "\tinitializing elements - starts\n"; Element* e1 = new Element; e1->sz1 = "first string - first element"; e1->sz2 = "second string - first element"; Element* e2 = new Element; e2->sz1 = "first string - second element"; e2->sz2 = "second string - second element"; std::cout << "\tinitializing elements - done\n"; std::cout << "\tsetting up list - started\n"; QList<Element>* list = new QList<Element>; list->append(*e1); list->append(*e2); std::cout << "\tsetting up list - done\n"; std::cout << "\tshow elements..\n"; std::cout << "\t0. sz1:\t" << list[0].sz1.toStdString(); std::cout << "\t0. sz2:\t" << list[0].sz2.toStdString(); std::cout << "\t1. sz1:\t" << list[1].sz1.toStdString(); std::cout << "\t1. sz2:\t" << list[1].sz2.toStdString(); std::cout << "\tshow elements done\n"; std::cout << "assingment starts\n"; list[1].sz1 = "dummy1"; list[1].sz2 = "dummy2"; std::cout << "\n"; std::cout << "\tshow elements second time..\n"; std::cout << "\t0. sz1:\t" << list[0].sz1.toStdString(); std::cout << "\t0. sz2:\t" << list[0].sz2.toStdString(); std::cout << "\t1. sz1:\t" << list[1].sz1.toStdString(); std::cout << "\t1. sz2:\t" << list[1].sz2.toStdString(); std::cout << "\tshow elements second time - done\n"; std::cout << "main finished\n"; return 0; }
-
hm.. auf die schnelle seh ich jetzt keinen Fehler unbedingt. Ich find es aber komisch, dass QList intern als array gecodet ist, aber das is ja jetzt egal.
Kann es sein, dass deine Variable list mit der std::list einen Konflickt hat? Versuch mal einen anderen Namen für deine variable.
Ah ne, jetzt noch was:
wenn du QList* list hast, musst du mit (*list)[1] darauf zugreifen oder mit list->at(i)
-
Hallo Maxi und Danke!
Lustig, bei mir gabs eine absolut identische Reaktion. Letztlich hab ich's gestern Abend auch noch gefunden, poste es aber erst heute: (*list)[idx]
Die QList ist afaik nicht als Array angelegt, bzw. kann man das nicht aus dem Indexoperator schliessen. Hierbei handelt es sich lediglich um einen ueberladenen Operator. Afaik sollte man wohl generell (ob STL oder Qt) eher zur at() Funktion greifen, allerdings gibt diese eine konstante Variable zurueck, ich will aber auch drauf zuweisen, somit hab ich mich fuer den ueberladenen [] entschieden.
-
doch, in der QT4 ist QList als array implementiert, steht ja in der doku, hab ja extra nachgeguckt. find grad keine online qt-doku... sonst hätt ich einen link gepostet. Steht aber im qtassistant bei QList ganz oben glaub ich