Seite 1 von 1

Effiziente Verwendung von Containern

Verfasst: 13. November 2007 15:56
von Spike
Hallöchen!

Ich beschäftige mich jetzt schon eine Weile mit Qt 4 und habe auch schon zwei C++ Crashkursbücher durch. Allerdings sind da immer noch einige Sachen offen, die durch die Bücher nicht beantwortet wurden und zwar im Bezug auf Container.

Ich packe in meinen Programmen häufig eine Klasse in einen Container um dort alle Infos zu speichern, Beispiel:

Code: Alles auswählen

class Einstellungen{
private:
QString Name;
.....
public:
void SetName(QString n){Name = n;}
QString GetName() const {return Name;}
.....
}

QList <Einstellungen> ProgEinstellungen;
Um in der QList Änderungen vorzunehmen mache ich dann beispielsweise Einstellungen Test = ProgEinstellungen.at(1);
Nehme die Änderungen in Test vor und ersetze den Eintrag in der QList mit Replace.
Da diese Art und Weise wegen dem Deep Copy absolut unschön ist, würde ich gerne fragen wollen, ob mir jemand sagen könnte, wie man so was richtig oder besser macht.
In den Büchern wird darauf nicht eingegangen und meine bisherigen Versuche den Containerinhalt anders zu ändern klappen alle nicht und im Forum habe ich konkret auch kein Beispiel finden können.

Wäre schön, wenn jemand vielleicht einen Tip hätte. Danke!
Spike

Verfasst: 13. November 2007 16:47
von DeepDiver
Wie wär's damit:

Code: Alles auswählen

Einstellungen& Test = ProgEinstellungen[1];
Damit arbeitest Du direkt auf dem Objekt im Kontainer.
Copy und Replace sind nicht mehr nötig.

Verfasst: 13. November 2007 19:28
von solarix
Da diese Art und Weise wegen dem Deep Copy absolut unschön ist
vielleicht übersehe ich was aber wo ist da ein deep copy...?

Verfasst: 13. November 2007 19:36
von Christian81
solarix hat geschrieben: vielleicht übersehe ich was aber wo ist da ein deep copy...?
da: QList <Einstellungen>

Verfasst: 13. November 2007 19:45
von solarix
Die eigentlichen Daten (des QStrings) werden da nicht mitkopiert, sondern nur die interne Referenz darauf.... oder irre ich mich?

Verfasst: 13. November 2007 21:56
von DeepDiver
Die Klasse wird ja noch mehr als nur einen Member vom Typ QString haben.

Aber egal, denn es gilt generell Kopien zu vermeiden - erst recht in einem Fall wie diesem, wenn man direkt auf der Referenz arbeiten kann.

Verfasst: 13. November 2007 22:05
von Christian81
Ausserdem ist es nicht ratsam eine Klasse als Value in einen Container zu packen - das kann nur schief gehen --> Pointer benutzen!

Verfasst: 13. November 2007 22:23
von solarix
DeepDiver hat geschrieben:[...]
Aber egal, denn es gilt generell Kopien zu vermeiden [...]
korrekt.. die Variante mit der Referenz ist unbestreitbar die performanteste Methode. Ich wollte nur anfügen, dass Qt bereits über das reference-counting extrem effizient arbeitet und man deshalb nur noch selten wirklich mit (eigenen) Referenzen und Pointern zu arbeiten braucht.
Christian81 hat geschrieben:Ausserdem ist es nicht ratsam eine Klasse als Value in einen Container zu packen - das kann nur schief gehen --> Pointer benutzen!
Was genau soll denn bei einer

Code: Alles auswählen

QList<QString> list;
(oder auch QList<MeineKlasse>) schiefgehen?

Verfasst: 13. November 2007 22:26
von Spike
Erst einmal ganz herzlichen Dank für die zahlreichen Kommentare, habt mir sehr geholfen :D
DeepDiver hat geschrieben:Wie wär's damit:

Code: Alles auswählen

Einstellungen& Test = ProgEinstellungen[1];
Das hat geklappt, allerdings geht es mit Einstellungen& Test = ProgEinstellungen.at(1); nicht und so hatte ich es die ganze Zeit lang über versucht :?
Christian81 hat geschrieben:Ausserdem ist es nicht ratsam eine Klasse als Value in einen Container zu packen - das kann nur schief gehen --> Pointer benutzen!
Du meinst also QList <Einstellungen*> ProgEinstellungen; ? Warum genau ist die andere Vorgehensweise nicht ratsam, hat in meinen Programmen bis jetzt geklappt.

Auf jeden Fall noch mals vielen Dank an alle :D
Spike

Verfasst: 13. November 2007 22:45
von Christian81
solarix hat geschrieben: Was genau soll denn bei einer

Code: Alles auswählen

QList<QString> list;
(oder auch QList<MeineKlasse>) schiefgehen?
Ok, falsch ausgedrückt. Es geht auf alle Fälle schief wenn es ein normaler User versucht (eher früher als später).
Man muss schon aufpassen dass man den copy ctor und operator= korrekt implementiert. Außerdem darf/sollte die Klasse nicht polymorph sein - warum kannst Du dir selbst überlegen :)