3dimensionales dynamisches Array in C++

Gast #1024311
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
#1024502
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
Gast #1024524
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...
Gast #1024573
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren