Objekte auf dem Heap -> Methodenzugriff?
-
std::vector<const karte*> karten[10]; for (int i = 0; i < 10; i++) for (int y = 0; y < 10; y++) karten[i][y] = &spielKarten[y];Wenn spielKarten richtig gefüllt ist, sollte das in etwa so dem entsprechen, was du willst, oder?
-
Wenn ich das von dir versuche, bekomme ich diesen Error:
error C2440: '=': 'Karte **' kann nicht in 'const Karte *' konvertiert werdenGrüße,
Neras
-
Ah. Mist. Nimm das & mal weg.
-
Ok, dass macht er nun. Und wie kann ich jetzt auf die Methoden des Objekts zugreifen?
cout << karten[0];macht er nicht. Kommt ein "Binärer Operator"-Error. Wenn ich
karten[0].mache, kann ich die Methoden des Vectors benutzen, aber ich hab da noch nicht soviel Sinn drin gesehen, sorry ^^°
Grüße,
Neras
-
karten ist ja ein vector von std::vector. mit [0] hast du den ersten, dann kannst du mittels karten[0][0] auf die erste Karte im ersten Container zugreifen und da das Zeiger sind mittels des -> Operators.
karten[0][0]->irgendeine_funktion_von_karte();
-
Der Compiler kompiliert das auch und den Ansatz hatte ich vorhin auch schon, aber wenn ich
cout << karten[0][0]->getName() << endl;eingebe, komme ich soweit, bis diese Ausgabe bearbeitet wird. Dann bricht das Programm mit einem Error "Expression: vector subscript out of range" ab. Heißt das soviel wie, dass ich etwas lesen will, was nicht vorhanden ist?
Grüße,
Neras
-
Genau. Dann hast du Elemente nicht richtig gefüllt. Schau doch mal mit dem Debugger, wo du das genau machst und ob dieser Ausschnittcode auch wirklich nach dem befüllen kommt.
-
Ich habe jetzt festgestellt, dass der Error nicht von dem cout kommt, sondern von der "Einlese-Methode", die du vorhin geschrieben hast. Ich kann dir Code geben, wenn du mir sagst, welche Stellen du brauchst

Danke an dieser Stelle an dich, dass du mir soweit weiterhilfst
Grüße,
Neras
-
Eben, der Error rührt daher, dass du auf den Index
[0][0]desstd::vectors zugreifst, der aber nicht vorhanden ist. Mindestens einer der verschachtelten Vectors ist leer, was du auch mitsize()oderempty()überprüfen kannst.Geh zu der Stelle, wo der
std::vectorinitialisiert wird und stelle sicher, dass sich danach Elemente im Container befinden.
-
Ich hab vor die Schleifen eine size Abfrage gestellt und heraus kam, dass der vector "spielKarten" 10 Elemente hat und der vector "karten" 0 Elemente. In den Schleifen sollte der vector "karten" ja dann gefüllt werden. Erscheint mir also richtig, oder? oO Auffällig waren nur die unterschiedlichen schreibweisen der beiden size-Abfragen:
cout << spielKarten.size() << endl; cout << karten->size() << endl;Grüße,
Neras
-
Ja, aber bevor der
karten-Vector gefüllt ist, darfst du nicht mit dem Indexoperator darauf zugreifen. Mit der Memberfunktionpush_back()kannst du allerdings Elemente hinten anhängen.Die unterschiedliche Schreibweise mit
operator.undoperator->hat damit zu tun, dass die eine Variable einstd::vectorund die andere einstd::vector*ist. Kommt halt drauf an, wie sie deklariert wurden
-
std::vector<Karte*> spielKarten; std::vector<const Karte*> karten[10];Kartenfabrik spiel(pStapelAuswahl); spielKarten = spiel.getKarten(); cout << spielKarten.size() << endl; cout << karten->size() << endl; for (int i = 0; i < 10; i++) for (int y = 0; y < 10; y++) karten[i][y] = spielKarten[y]; cout << //Hier will ichdarauf zugreifenSo sieht der Code aus. Ich erstelle zuerst ein neues Objekt der Kartenfabrik und übergebe dann dem vector "spielKarten" mithilfe der Methode des Objektes spiel die Daten aus einem vector des Objekts. Die zwei couts danach sind die Abfragen, wieviel in den beiden vectoren enthalten ist. Dann kommen die Schleifen, die den leeren vector karten füllen sollen. Erst danach greife ich auf diesen zu.
Also liegt der Fehler an demkarten[i][y] = spielKarten[y];?
Grüße,
Neras
-
Neras schrieb:
Ich hab vor die Schleifen eine size Abfrage gestellt und heraus kam, dass der vector "spielKarten" 10 Elemente hat und der vector "karten" 0 Elemente. In den Schleifen sollte der vector "karten" ja dann gefüllt werden. Erscheint mir also richtig, oder? oO Auffällig waren nur die unterschiedlichen schreibweisen der beiden size-Abfragen:
cout << spielKarten.size() << endl; cout << karten->size() << endl;Grüße,
NerasDas ist klar, dass die leer sind. Du hast ja noch nichts befüllt. Das geschieht in der Schleife. Also mach das lieber einmal nach dem befüllen.
spielKarten gehe ich einmal davon aus, dass das mittlerweile richtig klappt, also musst du nur noch das befüllen richtig machen. Dann klappt das.
karten ist ja ein Array von vectoren, also müsste der Zugriff so gehen:
karten[0].size();Allerdings funktioniert die Version :
karten->size();auch, da karten auf das erste Element des Array verweist.
EDIT:
Schau mal, wie das ganze aussieht kurz bevor das cout kommt. Also noch bevor der Fehler kommt.
-
Zudem würde ich von sowas abraten:
std::vector<const Karte*> karten[10];Willst du wirklich ein Array mit 10 Vectoren vom Typ
const Karte*? Also nicht nur einen Container? Falls ja, würde ich eherstd::tr1::arrayverwenden:std::tr1::array<std::vector<const Karte*>, 10> karten;Geht aber nur mit TR1-Unterstützung (ansonsten
boost::array). Es braucht folgenden Header:#include <array>
-
Ich habe die Schreibweise von drakon übernommen. Im Endeffekt wollte ich ja nur 10 Zeiger auf die erste Stelle im vector "spielKarten" erstellen.
@drakon:
Übringens kommt der Fehler nicht von dem cout, sondern von deiner Schleife. Wenn ich kein cout mache, kommt der Error trotzdem.Grüße,
Neras
-
Neras schrieb:
Ich habe die Schreibweise von drakon übernommen. Im Endeffekt wollte ich ja nur 10 Zeiger auf die erste Stelle im vector "spielKarten" erstellen.
Eben, warum brauchst du dann ein Array von Containern? Da reicht ein
std::vector<const Karte*>...Neras schrieb:
Übringens kommt der Fehler nicht von dem cout, sondern von deiner Schleife. Wenn ich kein cout mache, kommt der Error trotzdem.
Das sagen wir ja die ganze Zeit! Du greifst auf ungültige Indizes zu.
-
Nexus, dass habe ich wohl verstanden

Den Array von vectors habe ich bereits verschwinden lassen.
Die Schleife, die den Error ausspuckt ist ja nur übernommen aus dem Post von drakon.
Nexus, wie würdest du 10 Zeiger auf das erste Element in dem vector "spielKarte" erzeugen?Grüße,
Neras
-
Neras schrieb:
Nexus, wie würdest du 10 Zeiger auf das erste Element in dem vector "spielKarte" erzeugen?
Zehn Zeiger auf das gleiche Element?
Ich bin mir ehrlich gesagt nicht ganz sicher, was du machen willst. Sag am besten nochmals ausführlich, wie die Container deklariert sind und was sie speichern sollen.
-
Also das mit dem Array von std::vector habe ich mich auch gesträube zu machen, aber da ich immernoch nicht richtig weiss, was er eigentlich machen will habe ich einfach mal das nächstligenste gemacht, weil er halt gesagt hat 10 container von Zeigern auf Karten. Natürlich hätte es ein array (oder halt ein container) von 100 Elementen auch getan, aber das ganze ist ein wenig konfus..

Nexus, wie würdest du 10 Zeiger auf das erste Element in dem vector "spielKarte" erzeugen?
Das haben wir doch bereits (wie ich mich entsinne) erfolgreich gemacht.. ?!
-
Ok, vergessen wir alles, was wir vorher gesagt haben.
Meine Idee:
Ich möchte ein Kartenspiel machen. Dieses Kartenspiel hat 10 Stapel a 10 Karten, also 100 Karten insgesamt.
So, jetzt habe ich die Werte der Karten aus einer .txt Datei eingelesen und jeweils eine Karte jedes Stapels auf dem Heap erzeugt. Wenn ich jetzt für jede Karte ein Objekt machen würde, hätte ich 100 Objekte, die ich wahrscheinlich nochnichtmal alle brauche, weil sie im Spiel nachher nicht gezogen werden. Soweit verstanden? Wenn ja, dann weiter; wenn nein, lieber erst nochmal nachfragen, bevor es wieder zu so einem durcheinander kommt, wie vorher
Und jetzt kommt der Part, den ich die ganze Zeit eigentlich nur wissen wollte:
Anstatt jetzt 100 Objekte zu erzeugen, wollte ich nur von jedem Kartentyp ein Objekt erstellen und dann 10 Zeiger auf jedes dieser Kartenobjekte zeigen lassen.
Die Kartenobjekte liegen auf dem Heap und die Zeiger, die darauf zeigen, liegen in dem vector "spielKarten". Soweit klar? xDGrüße,
Neras