Array über Konstruktor initialisieren

flo_hr

Mitglied
Hey,...

ich komme von der JAVA Ecke und muss mich im Studium mit C++ "herumschlagen" ;) .

Ich habe folgendes, wahrscheinlich triviales Problem, komme aber irgendwie nicht weiter:

Ich habe eine Klasse Turm:
Code:
class Turm {
private:
    int hoehe;
    int scheiben[];
public:
    Turm(int hoehe, int paScheiben[]);
    Turm();
    virtual ~Turm();
    int pop();
    void push(int scheibe);
    void druck();
    int getHoehe();
    void setHoehe(int hoehe);
    int getScheibe(int index);
};

Ich würde gerne über den Konstruktor das Array "scheiben" initialisieren, weiß aber nicht wie ich das anstellen soll.
Eine direkte Zuweisung wie zB:
Code:
Turm::Turm(int hoehe, int paScheiben[]) {
    this->hoehe = hoehe;
    this->scheiben = paScheiben;
}
funktioniert ja in C++ nicht, soweit ich das Verstanden habe.

Folgendes habe ich auch schon ausprobiert:
Code:
memcpy(this->scheiben, paScheiben, sizeof (paScheiben));
Dies hat aber ziemlich komische Effekte zur Folge. Wenn ich dann nämlich das Objekt folgendermaßen instanziiere:
Code:
int scheiben[4];
scheiben[0] = 4;
scheiben[1] = 3;
scheiben[2] = 2;
scheiben[3] = 1;
Turm t1(4, scheiben);
und anschließend das Array des t1 Objekts ausgebe, scheint alles zu funktionieren.

Wenn ich aber zusätzlich noch ein willkürliches anderes Array anlege, ändern sich die Werte des scheiben Arrays im t1 Objekt:
Code:
int scheiben[4];
scheiben[0] = 4;
scheiben[1] = 3;
scheiben[2] = 2;
scheiben[3] = 1;
int test[3];
Turm t1(4, scheiben);

Letztendlich müsste ich doch auch für das Array in der Klasse Turm eine Größe angeben, wenn ich es im Konstruktor initialiseren möchte, oder?

Wie ist also der Beste Weg, ein Objekt-Attribut vom Typ Array, über ein Konstruktor zu initialisieren?
Ich bin für jede Hilfe dankbar.

Viele grüße
Florian
 
Hallo Florian,

wie wäre es mit Zeigerarrays:
C++:
class Turm {
private:
    int hoehe;
    int *scheiben;
public:
    Turm(int hoehe, int *paScheiben);
    Turm();
// ...

Und in der Implementierung:
C++:
Turm::Turm(int hoehe, int *paScheiben) {
  this->hoehe = hoehe;
  this->scheiben = paScheiben;
}

Turm::Turm() {
  this->scheiben = NULL;
}

Turm::~Turm() {
  if (this->scheiben != NULL) {
    delete[] this->scheiben;
  }
}

Da hier das Array aber nicht wirklich kopiert wird, sondern nur der Zeiger (welcher auf das eigentliche Array/Speicher zeigt), muss/sollte Turm selbst im Destruktor den Speicher wieder freigeben.

Ein Zeigerarray initialisiert folgendermaßen:
C++:
int *scheiben = new int[4];
scheiben[0] = 4;
scheiben[1] = 3;
scheiben[2] = 2;
scheiben[3] = 1;

Turm neuerTurm(4, scheiben);

// Hier nicht scheiben mittels delete[] löschen!
 
Hi ComFreek,

vielen Dank für deine schnelle Antwort. Mit dieser Lösung funktioniert es jetzt auch, so wie ich es mir vorgestellt habe.

Die lieben Zeiger ;) , da muss ich mich erstmal dran gewöhnen. In JAVA hat man ja Referenzen (eigentlich ja das gleiche wie Zeiger in C++). Aber da gibt es halt NUR Referenzen und man muss sich keine Gedanken machen, was man jetzt braucht bzw sinnvoll ist ;) .

viele grüße
Florian
 

Neue Beiträge

Zurück