tipps zum programmentwurf
-
hi,
ich haette mal eine allgemeine frage fuer einen programm-entwurf von mir.
ich gebe kurz ein beispiel, waere nett wenn jemand tipps haette:Ich habe eine Klasse von Elementen (Beispielsweise Karten fuer ein Kartenspiel)
und eine Art Container-Klasse (Kartenstapel), die diese Elemente (Karten) in einem stl-vector enthaelt.Mein problem ist, wie erstelle ich die karten? Ist es guenstig diese durch eine entsprechende methode der Container-Klasse einmal auf dem Heap zu erstellen und im STL-Vector Zeiger (bzw. referenzen) auf die erstellten Elemente zu verwalten anstatt die objekte selbst?
danke.
-
Hallo,
ich glaube, dazu gabs schonmal ne Frage. Auch genau zu einem Kartenspiel. Meiner Meinung nach ist es nicht notwendig, diese Karten auf dem Heap zu erstellen, es sei denn, es ist unbedingt erforderlich. Du musst bedenken, dass du hinterher, bevor du den Vector zerstörst, auch für jede Karte delete aufrufen musst. Außerdem ist der Heap auch langsamer als der Stack.
-
das mit dem delete ist mir schon klar. es ging mir mehr um folgendes:
ich weiss ganz einfach nicht an welcher stelle in meinem programm die karten erstellt werden sollen. Geschieht es in irgendeiner methode lokal, dann ist der lebenszyklus der karten nur auf diese methode begrenzt. D.h. wenn beispielsweise meine Kartenstapel-Klasse eine methode init() haette die ungefaehr folgendes macht:
// ... Karte k1; stapel.push_back(k1); // ...
dann koennte ich nach aufruf von init() nicht mehr auf die karten im stapel zugreifen. die karten also in der klasse Kartenstapel lokal zu erzeugen macht keinen sinn. Ich haette eigentlich einen tipp mehr in die richtung gebraucht
danke.
-
Karte k1; stapel.push_back(k1);
Hier wird eine Kopie von kl gepusht! Die lebensdauer der Karte hängt also nur von der Lebensdauer des Stapels ab.
stapel.push_back(Karte()); // Genügt
Deine Karte muss natürlich einen passenden Copy-C'tor haben.
-
Hallo,
ich weiss ganz einfach nicht an welcher stelle in meinem programm die karten erstellt werden sollen.
Du hast dann überhaupt keine Wahl. Wenn du eine Variable lokal erstellst, kannst du gar keinen Zeiger oder eine Referenz verwenden, sondern musst das Objekt selber (bzw. die Kopie) hineinpushen. Du musst eben nur den Vector an jede Funktion übergeben, in der du eine Karten zufügen willst.
[EDIT]
Außer mit new natürlich, aber dann musst du, wie schon erwähnt, den ganzen Stapel mit delete wieder löschen. Das ist imho ein Nachteil, der schon gerechtfertigt sein sollte.
-
für kartenstapel gibts was bessres als vectoren->stack
-
ich glaub ich raffs noch nicht ganz richtig:
wenn ich in einer methode Stapel::foo() schreibe:
Stapel::foo(){ stapel.push_back(Karte()); } // oder aber ... Stapel::foo(){ Karte k1; stapel.push_back(k1); }
wie lange ist dann der lebenszyklus der eingefuegten karte!?!?! doch so lange wie der gueltigkeitsbereich von foo(), oder irre ich mich da?? jemand sagte das die eingefuegte karte so lange existiert wie der erstellte Stack.
Jetzt nicht lachen: Wird fuer foo() nicht ein eigener Stack aufgebaut und k1 (siehe oben) ist eine lokale Variable fuer diesen Stack????Ich bitte um Aufklaerung.
danke.
-
kann mir niemand einen klitze kleinen tipp geben
und mich aufklaeren?
(sorry fuer meine ungedult)
gruss
-
#include <iostream> #include <vector> using namespace std; class karte{ public: karte(const karte&){ cout << "copy" << endl; } karte() {} }; void insert(vector<karte>& stapel) { karte herz_dame; stapel.push_back(herz_dame); } int main() { vector<karte> stapel; insert(stapel); }
In Insert wird eine Karte erstellt. Anschließend wird in den Stapel eine Kopie der Karte eingefügt, was du daran erkennen kannst, dass der Copy-Konstruktor aufgerufen wird. Die "Original" Karte wird natürlich zerstört, aber für die Kopie ist der Stapel zuständig. D. h., sobald der Stapel zerstört wird, wird auch die Karte zerstört. Und wenn du etliche Funktionen hast, wo Karten eingefügt werden sollen, musst du den Vector übergeben, und es funktioniert genauso wie mit der insert Funktion.
-
habs gerafft. vielen dank.
ne kleine frage noch... hab den code ausgefuehrt jedoch check ich irgendwie nicht wieso der copy-konstr. aufgerufen wird. du hast doch nirgendswo den konstruktor mit einem referenzparameter aufgerufen aber trotzdem kommt die ausgabe "copy" ... ich stehe glaube ich momentan aufm schlauch!?!?!
PS. Carsten:
Deine comix-seite ist ne gute idee weiter so, ich zeichne seit ich 14 bin Comics (bin auch 26) und werde demnaechst mal auf deiner seite auch ein paar proben hinterlassengruss und danke.
-
ok .. ich vermute mal dass das intern in der STL passiert
Wenn ich falsch liege bitte berichtigen.danke.