Dynamisches mehrdimmensionales array
-
Hallo, ich möchte ein mehrdimmensionales dynamisches array erstellen welches ein Spielfeld darstellen soll. Hierbei soll jeder "Kachel" des Spielfeldes bestehend aus breite und laenge (int) eine hoehe (float) zugewiesen werden.
Nach langem Probieren habe ich es auch geschafft. Allerdings nur so, dass das Array (mit Namen "Kachel")im Konstruktor bekannt ist und nicht in der gesamten Klasse

#include <Vector> #pragma once using namespace std; class Spielfeld{ public: Spielfeld(int breite, int laenge) { vector< vector<float> > Kachel(breite); for (int i = 0; i < breite; i++) { Kachel[i].resize(laenge); } Kachel[1][1]=7; //Hier funktioniert es, da das Array "Kachel" im Konstruktor bekannt ist. } void set_hoehe (int breite,int laenge, float hoehe) { Kachel[breite][laenge]=hoehe; //Geht nicht, da "Kachel" nur im Konstruktor bekannt ist. } };Wie kann ich das Array "Kachel" so angeben, dass es in der gesamten Klasse bekannt ist?
-
Das liegt wohl daran das du das Array "Kachel" lokal im Konstruktor anlegst. Nach verlassen des Konstruktors wird das wieder gelöscht. Schreibe das Array einfach als Membervariable in die Klassendeklaration.
-
Das Problem ist ja, das ich schon bei der Deklaration die Breite mit angebe.
vector< vector<float> > Kachel(breite);Wie kann ich das als Member in die Klassendekleration schreiben, ohne schon die Breite angeben zu müssen, die ich erst im Konstruktor erfahre?
-
per initialisierungsliste?
class Spielfeld{ public: Spielfeld(int breite, int laenge) : Kachel(breite) { for (int i = 0; i < breite; i++) { Kachel[i].resize(laenge); } Kachel[1][1]=7; //Hier funktioniert es, da das Array "Kachel" im Konstruktor bekannt ist. } void set_hoehe (int breite,int laenge, float hoehe) { Kachel[breite][laenge]=hoehe; //Geht nicht, da "Kachel" nur im Konstruktor bekannt ist. } private: vector< vector<float> > Kachel; };
-
Danke!
Ich bin eigentlich JAVA Programmierer und stehe mit der Initialisierungsliste auf'm Kriegsfuß.
Wo kann man nachlesen, ich welchen Fällen man die Initialisierungsliste verwenden soll / muß?
-
Initialisierungslisten brauchst du eigentlich immer wenn du Klasseneigenen Variablen ein Argument für den Konstruktor mitgeben musst

-
Andreas XXL schrieb:
...Wo kann man nachlesen, ich welchen Fällen man die Initialisierungsliste verwenden soll / muß?
Soll> Immer, wo es geht.
Muss> bei const- und Referenz-MembernGruß,
Simon2.
-
darthdespotism schrieb:
class Spielfeld{ public: Spielfeld(int breite, int laenge) : Kachel(breite) { for (int i = 0; i < breite; i++) { Kachel[i].resize(laenge); } Kachel[1][1]=7; //Hier funktioniert es, da das Array "Kachel" im Konstruktor bekannt ist. }Das geht sogar noch kürzer - wenn man weiß, daß der vector<>-Ctor zwei Parameter übernehmen kann:
Spielfeld(int breite,int laenge) : Kachel(breite,vector<double>(laenge)) { Kachel[1][1]=7; }
-
Andreas XXL schrieb:
Ich bin eigentlich JAVA Programmierer und stehe mit der Initialisierungsliste auf'm Kriegsfuß.
Wo kann man nachlesen, ich welchen Fällen man die Initialisierungsliste verwenden soll / muß?
Um es genauer zu erklären:
Wenn du bereits im Konstruktorrumpf bist, existieren die Membervariablen bereits. Daher musst du immer dann auf die Initialisierungsliste zurückgreifen wenn eine nächträgliche Änderung nicht möglich ist (const), bzw. es eine Zuordnung geben muss (Referenzen). Zusätzlich wird Standardmäßig bei Klassen der Standardkonstruktor aufgerufen, was in manchen Fällen nicht gewünscht ist, oder die Basisklasse soll über einen anderen Konstruktor als dem Basiskonstruktor initialisiert werden. Auch für diese Fälle ist die Initialisierungsliste zwingend zu verwenden.
Die Initialisierungsliste wiederum tritt bereits der Erstinitialisierung in Kraft, hier musst du nur aufpassen das du keine Abhängigkeiten zwischen den Membervariablen einbaust, oder sicherstellst, das die Initialisierung in Reihenfolge der Deklaration geschieht (Unabhängig von der Reihenfolge in der Initialisierungsliste werden Member in Reihenfolge ihrer Deklaration angelegt).
Daher ist es grundsätzlich sinnvoll, unabhängig von dem "Mussfall", die Initialisierungsliste zu verwenden, um unnötige Mehrfachinitialisierung zu vermeiden. Letzteres mag bei den Basistypen noch unproblematisch sein, bei komplexen Klassen spielt es aber eine Große Rolle.
cu André