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


Anmelden zum Antworten