Seite 1 von 1

QList<int>* per Zeiger ?

Verfasst: 16. Januar 2012 13:13
von lespaul
Hallo,

ich habe drei Zeiger auf ein QListobjekt mit int Werten

Code: Alles auswählen

QList<int>* gesamtListe = new QList<int>;
//.. 
//.. hier wird die gesamtListe mit irgendwlechen Werten gefüllt
//..
QList<int>* roteElemente = NULL;
QList<int>* blaueElemente = NULL;
Meine gesamtListe ist bereits gefüllt, wobei roteElemente und blaueElemente noch nicht initialisiert sind und auf 0 zeigen.

Ich habe nun eine Methode, wleche meine gesamtListe in rot und blau sortiert. Die oben erstellten Zeiger würde ich dann gerne hier füllen, also die Objekte werden auch in der Methode mit new erzeugt usw.:

Code: Alles auswählen

void sortiereListe(QList<int>* in_gesamtL , QList<int>* in_roteL , QList<int>* in_blaueL )
{
QList<int>* in_roteL = new QList<int>;
QList<int>* in_blaueL = new QList<int>;

for (;;){
//.. bla selektiere
in_roteL->append(red_value_from_in_gesamtL);
in_blaueL->append(blua_value_from_in_gesamtL);
}
}
Also ich gebe in der Methode nichts zurück. Da ich die Zeiger ausserhalb der Funktion erstellt habe, sollte es ja auch nach den Methode dahinzeigen?
Wenn ich nun
sortiereListe(gesamtListe , roteElemente, blaueElemente )
aufrufe sind die letzteren leer?

Grus Lespaul

Re: QList<int>* per Zeiger ?

Verfasst: 16. Januar 2012 13:22
von franzf
Sorry, aber das ganze HEAP-gebastel ist ein Krampf :/
QList einfach in den automatischen Speicher ("Stack") legen. Listen als (nicht-const) Referenz übergeben und modifizieren.
Dein Code verletzt nämlich leider auch noch die Regel, dass Erzeugung und Zerstörung beim selben Verantwortlichen liegen sollte. (Gut, bei den QObject-Hierarchien ist das was anderes, aber hier hast du Daten, da sollte klar sein wem die gehören.) Wahrscheinlich erzeugst du sogar ein nettes MemoryLeak :P

Ich würde das so machen:

Code: Alles auswählen

QList<int> gesamteListe;
// die beiden anderen werden hier noch gar nicht deklariert, erst direkt bevor sie gebraucht werden

void sortiereListe(QList<int> const& in_gesamtL , QList<int>& in_roteL , QList<int>& in_blaueL )
{
  for (;;){
    //.. bla selektiere
    in_roteL.append(red_value_from_in_gesamtL);
    in_blaueL.append(blua_value_from_in_gesamtL);
}
}

// Benutzung:
QList<int> rote;
QList<int> blaue;
sortiereListe(gesamteListe, rote, blaue);

Re: QList<int>* per Zeiger ?

Verfasst: 16. Januar 2012 13:43
von lespaul
Vielen Dank für dei Antwort. Kannst du was zum & erklären?
Es wird also als Referenz übergeben?
bezieht sich das const auf das QList oder auf die Elemente?

Thnx! Lespaul

Re: QList<int>* per Zeiger ?

Verfasst: 16. Januar 2012 13:55
von franzf
lespaul hat geschrieben:Kannst du was zum & erklären?
Es wird also als Referenz übergeben?
Genau. Einfach in deinem C++-Buch "Referenzen" nachschlagen.
bezieht sich das const auf das QList oder auf die Elemente?
Es bezieht sich auf das übergebene Objekt, wodurch aber natürlich auch die Member betroffen sind: Nur const-Methoden können aufgerufen werden, public Member können nicht modifiziert werden.
QList<int> const& value
Lies: "value ist eine Referenz auf ein Objekt vom Typ QList<int> const".
(Type const ist gleichbedeutend zu const Type. Da aber nur hier das const auch VOR dem Bezeichner stehen kann, nehm ich lieber die konsistente Schreibweise:
Memberfunktionen:
void doIt() const;
Zeiger:
int *const (konstanter Zeiger auf int)
int const* const (konstanter Zeiger auf const int)
nur hier ginge auch const int*const, was mMn. doof ist)
Aber auch hier -> Buch Thema "Modifizierer const" o.Ä.

Re: QList<int>* per Zeiger ?

Verfasst: 20. Januar 2012 09:17
von lespaul
Danke, funzt ;)