C++: Zwei-Dimensionales Array als Klasse

in meinem C++ - Klasse an der Universität, ich habe zu implementieren, die einen Gerichteten, gewichteten Graphen. Als interne Darstellung ich habe zu implementieren, die ein zwei-dimensionales array, was speichert die Informationen über die Kanten zwischen den Ecken in die Kurve.

okay, ich habe implementiert eine C++ - Klasse "TwoDimArray" mit einem überladenen operator [].

funktioniert es gut, solange ich Objekte instanziieren von TwoDimArray in main(). Aber nicht als Schüler.

Meiner Klasse für die Darstellung des Graphen ist "DirectedGraph" und hat einen privaten member "adjacencyMatrix" der Typ TwoDimArray*.

Im Konstruktor meiner Klasse DirectedGraph ich beabsichtige, füllen Sie das array mit Nullen zunächst, der angibt, "es gibt keine Kante zwischen den Knoten i und j".

okay, und dies ist, wo alles schief geht. Ich kann schreiben, bis Koordinate [0][2] (bei der Initialisierung des Graphen mit 3 Knoten, so sollte das array haben, 3x3 Zellen). wenn Sie versuchen, zu schreiben-Adresse [1][0] die Zuordnung Betrieb stürzt mit segmentation fault. So gilt die Abtretung Vorgänge sind erfolgreich, n-mal und scheitern Anfang an n+1 (wobei n die Anzahl der Eckpunkte).

Irgendwelche Ideen was ich falsch mache?

Meine TwoDimArray Klasse (erst header, dann die Implementierung):

#ifndef TWODIMARRAY_H_INCLUDED
#define TWODIMARRAY_H_INCLUDED


class TwoDimArray{


 private:


   int* pArr;
   int rows;
   int cols;


 public:

   TwoDimArray(int rows, int cols);
   int* operator[](int row);
   ~TwoDimArray();

};


#endif //TWODIMARRAY_H_INCLUDED

Umsetzung:

#include <TwoDimArray.h>

TwoDimArray::TwoDimArray(int nrOfRows, int nrOfCols){

   rows = nrOfRows;
   cols = nrOfCols;

   //allocate memory
   pArr = new int[rows * cols];


 }


int* TwoDimArray::operator [](int row){

   return &pArr[row * cols];
}


  TwoDimArray::~TwoDimArray(){

   delete[] pArr;
}

Gerichteter Graph header:

    #define DIRECTEDGRAPH_H_INCLUDED
    #include <string>
    #include <list>
    #include <Vertex.h>
    #include <TwoDimArray.h>


    using namespace std;

    /**
     * DOCUMENTATION
     * ======================
     * object oriented Implementation
     * of the abstract
     * Datatype Directed Graph
     * as C++ class
    */

    class DirectedGraph{


       private:

          int maxVertices;
          list<Vertex> vertices;
          TwoDimArray* adjacencyMatrix;
          bool edgeExists(string srcName, string tgtName);
          int vertexExists(string vName);



       public:

          //DirectedGraph();
          DirectedGraph(int maxVertices);
          ~DirectedGraph();


          void AddVertex(Vertex& v);
          void AddEdge(Vertex& source, Vertex& target, int weight);

          int getMaxVertices() const;
          list<Vertex> getVertexNames()const;

          void PrintGraph();

    };




    #endif //DIRECTEDGRAPH_H_INCLUDED

Gerichteter Graph-Implementierung (nur der Konstruktor):

    DirectedGraph::DirectedGraph(int maxV){

       this->maxVertices = maxV;

       //initialize the array
       this->adjacencyMatrix = new TwoDimArray(maxV, maxV);

       int i = 0;
       int j = 0;

       for(i = 0; i <= maxVertices - 1; i++){

          for(j = 0; j <= maxVertices - 1; j++){

             //==> the fatal assignment
             //fails at i = 1 and j = 0

             *adjacencyMatrix[i][j]=0;
             cout << "assigned " << i << " " << j << "with 0"<<endl;
          }
       }
    }

irgendwelche Vorschläge?
ich denke, es ist nicht okay, zu erklären, das der Klasse als TwoDimArray* statt TwoDimArray, aber sonst ist es nicht kompilieren.

Dem, was ive versuchte auch ist:

    DirectedGraph::DirectedGraph(int maxV){

       this->maxVertices = maxV;
               //try to instantiate TwoDimArray 
       TwoDimArray myArr(maxV, maxV);
       this->adjacencyMatrix = myArr;

       int i = 0;
       int j = 0;

       for(i = 0; i <= maxVertices - 1; i++){

          for(j = 0; j <= maxVertices - 1; j++){

             //==> the fatal assignment
             //fails at i = 1 and j = 0
             myArr[i][j]=0;
             cout << "assigned " << i << " " << j << "with 0"<<endl;
          }
       }
    }

aber es scheitert an der gleichen Stelle.
ich bin nicht sehr vertraut mit Zeiger-Logik in c++ ich muss zugeben,...

irgendwelche Vorschläge?

vielen Dank im Voraus
Roland

  • Bitte beschränken Sie es auf das erforderliche minimum und fixieren Sie Ihre Formatierung - es gibt keine Notwendigkeit für doppelte Abstand.
InformationsquelleAutor Monty Burns | 2013-01-07
Schreibe einen Kommentar