Effiziente Verwendung von Containern

Alles rund um die Programmierung mit Qt
Antworten
Spike
Beiträge: 2
Registriert: 10. November 2007 11:21

Effiziente Verwendung von Containern

Beitrag 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
DeepDiver
Beiträge: 34
Registriert: 7. November 2007 10:10
Wohnort: Fürstenfeldbruck
Kontaktdaten:

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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...?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

solarix hat geschrieben: vielleicht übersehe ich was aber wo ist da ein deep copy...?
da: QList <Einstellungen>
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Die eigentlichen Daten (des QStrings) werden da nicht mitkopiert, sondern nur die interne Referenz darauf.... oder irre ich mich?
DeepDiver
Beiträge: 34
Registriert: 7. November 2007 10:10
Wohnort: Fürstenfeldbruck
Kontaktdaten:

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ausserdem ist es nicht ratsam eine Klasse als Value in einen Container zu packen - das kann nur schief gehen --> Pointer benutzen!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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?
Spike
Beiträge: 2
Registriert: 10. November 2007 11:21

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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 :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten