Forum: PC-Programmierung 3dimensionales dynamisches Array in C++


von funky (Gast)


Lesenswert?

Hallo,

ich habe eine Frage zur Verwendung von Matrizen in C++

Ich bin dabei mir eine kleine Matrix Klasse zu schreiben. Hier mal 
Auszüge

matrix.h
1
class Matrix
2
{
3
    private:
4
        double *matrixArr;
5
        int Rows, Cols, Planes;
6
    public:
7
        Matrix(int Zeilen, int Spalten, int Level);
8
        ~Matrix();
9
};

matrix.cpp
1
//Konstruktor
2
Matrix::Matrix(int Zeilen, int Spalten, int Level)
3
{
4
  Rows = Zeilen;
5
   Cols = Spalten;
6
  Planes = Level;
7
   // Array allokieren
8
   matrixArr = new double[Rows * Cols * Planes];
9
}
10
//Dekonstruktor        
11
Matrix::~Matrix(){
12
  delete [] matrixArr;
13
}

Im Konstruktor allokiere ich den Speicher als 1-dimensionales Feld 
fürdie Größe eines 3dimensionalen Arrays (korrekt so?)

Wenn ich im Hauptprogramm ein Objekt der Klasse instanziiere, würde ich 
dann gerne in der Form matrix[0][0][0] = 1;   darauf zugreifen.
Wenn ich das so hinschreibe, dann funktioniert es nicht...was sogar mir 
logisch erscheint, da das Programm ja gar keine direkten Informationen 
über die Dimensionen meines Arrays hat.
Aber wie bekomme ich denn das hin, das meine gewünschte Zugriffsform 
funktioniert?
Muss man dazu [] irgendwie überladen? Ich habe da für 2dimensionale 
Arrays
etwas gesehen, aber selbst da habe ich es nicht so ganz verstanden. ich 
überlade [] und benutze im Hauptprogramm ja [][]  oder in meinem fall 
[][][]. Wie soll denn das funktionieren?
Kann mir jemadn mal einen Tip gebenwie das funktioniert? Oder muss ich 
den Speicher für mein Array schon ganz anders allokieren?

Danke, Axel

von Arc N. (arc)


Lesenswert?

Es gibt eine Reihe von Gründen das genau so nicht zu machen.
Aufgeführt z.B. hier: 
http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.10 
(bis 13.12)
Besser ist es statt [] () zu überladen.

> Kann mir jemadn mal einen Tip gebenwie das funktioniert? Oder muss ich
> den Speicher für mein Array schon ganz anders allokieren?

Wenn's kompatibel zur "normalen" Array-Syntax sein soll, kann man das 
z.B. so allozieren.
1
  // das Problem ist, das C/C++ keine richtigen mehrdimensionalen 
2
  // Arrays kennt sondern nur Array von Arrays von...
3
  int one[4] ...;
4
  int two[3][2] ...;
5
  int three[4][3][2] ...;
6
7
  int* oneP = one;
8
  int* twoP = two[0];
9
  int* threeP = three[0][1];
10
11
  int (*three2P)[2] = three[0];
12
  int (*three3P)[3][2] = three;
13
14
  // Allozierung
15
  int z = 5, y = 4, x = 3;
16
17
  int*** a3 = new int**[z];
18
  for (int i = 0; i < z; i++) {
19
    a3[i] = new int*[y];
20
    for (int j = 0; j < y; j++) {
21
      a3[i][j] = new int [x];
22
    }
23
  }
24
25
  a3[4][3][2] = 123;
26
  // ähnlich geht's auch mit std::vector
27
  // oder man nimmt gleich boost

A

von P. S. (Gast)


Lesenswert?

Was ist so schlimm an einem MyArray->GetValue( A, B, C);, dass man sich 
das Ueberladen von Arrays antun muss? Und falls mal jemand "Fremdes" 
deinen Code liest, wird er sich freuen, wenn keine Tretminen wie 
ueberladene Operatoren drin sind - die haben naemlich die unangenehme 
Eigenschaft, wie etwas Altbekanntes auszusehen, aber gaenzlich anders zu 
funktionieren...

von funky (Gast)


Lesenswert?

hmmm, da ist was dran.

solche konstrukte wie *** möchte ich nicht verwenden. da muss ich 
jedesmal nachgrübeln was es denn bedeutet(und wenn ich denkeich habs 
kapiert zerbrech ich mir nächstes mal wieder den kopp drüber :( )

@arc net: danke für den parashift link. ist sehr hilfreich die seite!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.