Hallo,
bin gerade dabei eine Klasse CSpeicherKlasse zu schreiben, welche ein QList<CMod*> mods als Member Variable hat.
Nun möchte ich über SpeicherKlasse->CMod.append(MeinMod) aus einer anderen Klasse heraus Elemente anhängen.
MeinMod ist vom Typ CMod*.
Meine Frage ist nun:
Ich möchte in Klasse SpeicherKlasse eine Liste mit vielen CMods haben. Wie sollte ich diese anlegen,
damit diese Während der ganzen Programmlaufzeit am Leben bleiben?
Ich weiß das ist eher ein C++ Problem (meine Unwissenheit).
Was ist sozusagen best practice um in einer Klasse Daten zu speichern, deren Anzahl sich erhöhen/verringern kann?
Die Daten sollten auf dem Heap landen, oder?
Wenn ich ein globales Objekt der CSpeicherKlasse erzeuge funzt es, aber dann ist eas auf dem Stack!?
Danke+Gruß
Bronko
Daten (QList Elemente) während Programmlaufzeit speichern
Container sind da schon das rechte Mittel !Was ist sozusagen best practice um in einer Klasse Daten zu speichern, deren Anzahl sich erhöhen/verringern kann?
Problem ist, das eine List<CLass *> ja nicht die Instanzen selber speichert, sonder nur Zeiger drauf.
Um das zu loesen, hasst 2 Ansatzpunkte:
1: Du speicherst statt Zeigern richtige Kopien.
statt List<Class *> also List<Class>.
Damit "leben" die Instanzen deiner Objecte in Deiner Liste, und nur ein erase, bzw der destruktor der Liste selber koennen die Zerstoeren.
Vorteil: Lebenszyklus ist an die Liste gebunden, loeschst die Liste, loescht es auch deine Instanzen korrekt.
Nachteil:
Deine Classe brauch nen CCTor (Virtualitaet macht probleme).
Beim Einfuegen entsteht immer eine Kopie. (Kopien koennen durchaus nichttrivial sein).
Trotzdem ist das die Nativere Version.
2: Du entkoppelst den Lebenszyklos von der Liste, und erzeugst und deletest deine Objecte expliziet.
d.h. du verwendest Liste<Class *>
und beim zerstoeren der Liste kümmerst dich seperat um das zerstoeren der Objecte.
Da den DTor der Liste ned ueberschreiben kannst / willst, solltest die funtkionalitaet eh ueber ne Komposition(Member mit Lebenszeitbindung) loesen, d.h. ne klasse, die liste als member, und im DTor deiner Klasse die Liste ausrauemen und die Objecte zerstoren.
Vorteil:
Brauchst kein CCTor (Virtuelle CToren möglich)
die Kopie beim Einfuegen kannst du geschickt wegoptimieren.
Nachteil:
Mehr Aufwand, nicht ganz so intuitiv, und ist nicht ganz so trivial Exceptionsicher zu machen ...
Version 2 ist die nicht ganz so intuitive Loesung, ganz einfach weil man hier schon funktionalitaet kapselt, und in diese Verwaltungsklasse meist schon Aufgabenspezifische Funktionen einbauen wird. Wie das Ding am ende Aussieht iss also schon von der Aufgabenstellung abhaengig.
Mindestens die Funktion zum einfuegen von Elementen wird eine angepasste Funktion sein.
raten wird ich generell zu 1, 2 nur, wenn trifftige Gründe dafuer sprechen (CCTor Problem/Virtualitaet, oder Kopie ist nicht trivial) !
Ciao ...