Dynam. mehrdim. Array aus Faq als Template
-
template<typename T> class Simple2DimArr { private: T* pArr; int Rows; int Cols; public: Simple2DimArr(int Zeilen, int Spalten) { Rows = Zeilen; Cols = Spalten; pArr = new T[Rows * Cols]; } T* operator[](int Zeile) { return & pArr[Zeile * Cols]; } ~Simple2DimArr() { delete [] pArr; } };
Hab das einfach aus der Faq genommen und wollte ein Template drausmachen.
Habe es folgendermaßen probiert:Simple2DimArr<int>* Array; Array = new Simple2DimArr<int>(3,3); *Array[0][0] = 1; *Array[1][0] = 1; *Array[2][0] = 1; *Array[0][1] = 1; *Array[1][1] = 1; *Array[2][1] = 1; *Array[0][2] = 1; *Array[1][2] = 1; *Array[2][2] = 1; delete Array;
Dabei steigt er bei der Abarbeitung bei *Array[1][0] aus (Zugriffsverletzung).
-
Hi,
warum machst Du einen Zeiger draus und holst dir noch mal mit new neuen Speicher? Wenn Du ein 2DimArray willst dann langt auch ein
"Simple2DimArr<int> Array(3,3)"
Die Klasse holt sich dann den Speicher schon selbst.
grüße Con@n
-
Das mach ich an der Stelle nur, weil ichs zum ausprobieren einfach alles bei einem OnClickButton reinkopiert habe.
Noramlerweise würdedas:Simple2DimArr<int>* Array;
bei mir im FormularHeader auftauchen, damit ich von überall da ran kann.
Und in irgendeiner Methode vom Form , wenn ich dann die benötigte Größe weis, wird es instanziert.
-
Hi,
gut, dann sag ich mal das Stichwort Operatorpriorität. Mit
Simple2DimArr<int>* Array; Array = new Simple2DimArr<int>(3,3); (*Array)[0][0] = 1; (*Array)[1][0] = 1; (*Array)[2][0] = 1; (*Array)[0][1] = 1; (*Array)[1][1] = 1; (*Array)[2][1] = 1; (*Array)[0][2] = 1; (*Array)[1][2] = 1; (*Array)[2][2] = 1; delete Array;
funktioniert das ganze bei mir. Ich würde das aber trozdem anders machen. Erweitere doch die Klasse um einen Konstruktor, der keine Argumente hat und um eine "resize" Methode.
grüße Con@n