OOP, dynamisches Array in C++ < Softwaretechnik+Pro < Praktische Inform. < Hochschule < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 18:57 Mo 29.12.2014 | Autor: | kolja21 |
Aufgabe | Das Klasseninterface:
class GameOfLife{
public:
GameOfLife(int rows, int cols);
~GameOfLife();
// weitere Methoden
};
Implementieren Sie den Konstruktor GameOfLife(int rows, int cols). Dieser soll den für ein Spielfeld mit rows Reihen und cols Spalten benötigten Speicher automatisch allozieren. Legen Sie die für den Zugriff auf das Spielfeld nötigen Variablen im private Bereich der Klasse an. Implementieren Sie außerdem den Destruktor ~GameOfLife(), der den für das Spielfeld allozierten Speicher wieder frei gibt. |
Wie ich die Aufgabe verstehe soll man für das genannte "Spielfeld" eine Matrix erstellen. Diese würde dann in dem private Bereich der Klasse deklariert werden. Da man bei C++ schon bei der Deklaration die Größe, also Anzahl der Elemente nennen muss, diese aber noch unbekannt sind, muss man Zeiger/Pointer benutzen. Die Definition erfolgt dann im Konstruktor. Und wenn im Konstruktor mit "new" Speicher alloziiert wird, muss er im Destruktor freigegeben werden. Woran es bei mir hängt ist, dass ich diese Fehlermeldung bekomme: "deleting array '((GameOfLife*)this)->GameOfLife::Matrix' [enabled by default]"
hier mein Code:
class GameOfLife {
private:
int* Matrix[];
public:
GameOfLife(int rows, int cols);
~GameOfLife();
};
GameOfLife::GameOfLife(int r, int c) {
*Matrix = new int[r * c];
}
GameOfLife::~GameOfLife(void) {
delete [] Matrix;
}
was habe ich falsch gemacht?
PS. Ich bin ein Anfänger im Programmieren und hab Null Erfahrung in OOP.
|
|
|
|
Hallo!
Du machst hier was komisches.
Zunächst mal definiert man mit
int* Matrix;
aber auch mit
int Matrix[];
einen Pointer für INTs. Ob * oder [] ist egal, ggf. deutet letzteres an, daß du vor hast, das für ein Array zu verwenden, aber für den Computer ist das einerlei.
Nun, mit
int *Matrix[];
deklarierst du einen Pointer auf einen Pointer für INTs. Du könntest das auch mit
int **Matrix;
erreichen.
Dann machst du das hier:
> *Matrix = new int[r * c];
Denk dran, Matrix eine Pointervariable (und enthält die Adresse eines Pointers, welcher wiederum die Adresse eines INTs enthalten kann), dann ist *Matrix die Adresse dieser Pointervariable selbst. Und nun kreierst du ein Array, und verschiebst Matrix an den Anfang dieses Arrays. Das dürfte von den Datentypen her schon gar nicht funktionieren, ich bin mir grade auch nicht ganz sicher. Sauber ist das ganze aber auf keinen Fall.
Generell hast du zwei Möglichkeiten:
Entweder kreierst du ein zusammenhängendes 1D-Array
int *Matrix;
Matrix = new int[r * c];
und mußt dich fortan selbst darum kümmern, aus gegebenen 2D-Koordinaten passende 1D-Koordinaten zu machen.
Besser ist aber das:
1: | int **Matrix;
| 2: | Matrix = new *int[r];
| 3: | for(int i=0; i<r; i++){
| 4: | Matrix[i]=new int[c]
| 5: | } |
Wie gesagt, int **Matrix ist ein pointer auf pointer auf INTs. In Zeile 2 weißt du Matrix ein Array von Pointern auf INTs der Länge r zu. Und in der FOR-Schleife wird jedem der Pointer ein INT-Array zugewiesen. Vorteil: Du kannst darauf mit Matrix[x][y] zugreifen!
Um es nochmal klar zu machen: Matrix[x] ist der Pointer auf ein INT-Array, und Matrix[x][y] ist dann der wert eines einzelnen Elements.
Das bedeutet übrigens auch, daß du hier r verschiedene Speicherbereiche reservierst. Darin unterscheidet sich das vom statischen int Matrix[5][6], welches einen einzelnen, zusammenhängenden Bereich für 5*6 INTs reserviert. (Der Computer übernimmt dann die Umrechnung von 2D zu 1D)
Vielleicht schaust du dir erstmal das eingehend an
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 14:10 Mi 31.12.2014 | Autor: | kolja21 |
Erst mal vielen Dank für die Hilfe.
Dieses Prizip (mit Pointer, die auf Pointer zeigen, und so eine Matrix bilden) kenne ich schon. Leider funktioniert es nich so wie ich es schreibe in Klassen, also OOP.
Hier der Code:
class GameOfLife {
private:
int** Matrix;
public:
GameOfLife(int rows, int cols);
~GameOfLife();
};
GameOfLife::GameOfLife(int r, int c) {
Matrix = new int[r];
for (int i=0; i<r; i++) {
Matrix[i] = new int[c];
}
}
GameOfLife::~GameOfLife(void) {
delete[] Matrix;
}
Das liefert diese Meldung: "cannot convert 'int*' to 'int**' in assignment" bei Zeile: Matrix = new int[r];
Die andere Frage ist, wie rechnet man ein 2-D Array in eine 1-D Array um? Vielleicht klappt es ja so?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 16:57 Mi 31.12.2014 | Autor: | felixf |
Moin!
> Erst mal vielen Dank für die Hilfe.
> Dieses Prizip (mit Pointer, die auf Pointer zeigen, und so
> eine Matrix bilden) kenne ich schon. Leider funktioniert es
> nich so wie ich es schreibe in Klassen, also OOP.
> Hier der Code:
>
> class GameOfLife {
> private:
> int** Matrix;
> public:
> GameOfLife(int rows, int cols);
> ~GameOfLife();
> };
> GameOfLife::GameOfLife(int r, int c) {
> Matrix = new int[r];
> for (int i=0; i<r; i++) {
> Matrix = new int[c];
> }
> }
> GameOfLife::~GameOfLife(void) {
> delete[] Matrix;
> }
>
> Das liefert diese Meldung: "cannot convert 'int*' to
> 'int**' in assignment" bei Zeile: Matrix = new int[r];
Kein Wunder: links steht ja auch ein Array von Arrays, und du willst dem ein einfaches int-Array zuweisen.
Versuch's doch mal mit new int[][c]; oder new (int*)[c];.
> Die andere Frage ist, wie rechnet man ein 2-D Array in eine
> 1-D Array um? Vielleicht klappt es ja so?
Was meinst du mit "umrechnen"?
Wenn du ein Array $A$ mit r*c Elementen hast, kannst du auf das $(i, j)$-Element mit $A[i*c + j]$ zugreifen (mit $0 [mm] \le [/mm] i < r$ und $0 [mm] \le [/mm] j < c$).
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:51 Do 01.01.2015 | Autor: | kolja21 |
Ist das alles? Weil wenn ich das:
Matrix = new int[c];
ersetze gegen:
Matrix = new int[][c];
bekomme ich diese Meldung: "Multiple markers at this line
- 'c' is not a constant expression
- expected primary-expression before ']' token
- array size in operator new must be constant"
und bei Matrix = new (int*)[c];
kommt das:"Multiple markers at this line
- Syntax error
- array bound forbidden after parenthesized type-id
- try removing the parentheses around the type-id
- Missing ';'
- cannot convert 'int**' to 'int*' in assignment"
vielleicht habe ich dich auch falsch verstanden und hätte noch was anderes ändern sollen? sorry, ich bin noch zu schlecht in c++
|
|
|
|