2016-06-14 15 views
0

Hallo Ich habe eine Frage bezüglich der Verwendung von Typedef in C++. Ich versuche, meine eigene Diagrammklasse zu erstellen, in der ich DFS und BFS ausführen kann. Ich habe bis jetzt alles beigefügt, was ich für die Klasse habe. Aber jedes Mal, wenn ich versuche zu kompilieren, stoße ich auf bestimmte Fehler, die ich einfach nicht beheben kann. Ich bin sicher, dass der Fehler etwas mit der Variablen VertexList zu tun hat, die ich verwende, um alle Scheitelpunkte zu halten.Typedef-Array-Referenzierung?

#include <iostream> 
#include <stack>  


class myGraph{ 
    public: 
     typedef struct Vertex{ 
      char label; 
      bool visited; 
     }Vertex; 
     myGraph(int); 
     void AddVertex(char); 
     void addEdge(int, int); 
     int adjUnvisited(int); 
     void displayVertex(int); 
     void dfs();  

    private: 
     Vertex* vertexList; 
     int** adjMatrix; 
     int size; 
     int vertices; 
     int count;  

};  

myGraph::myGraph(int size){ 
    count = 0; 
    size = size; 
    vertices = size; 
    vertexList = new Vertex[vertices]; 
    adjMatrix = new int*[size]; 
    for(int i=0; i<size; i++){ 
     adjMatrix[i] = new int[vertices]; 
    }  

    for(int i=0; i<vertices; i++){ 
     for(int j=0; j<vertices; j++){ 
      adjMatrix[i][j] = 0; 
     } 
    }  



}  

void myGraph::AddVertex(char label){ 
    Vertex* myVertex = new Vertex(); 
    myVertex->label = label; 
    myVertex->visited = false; 
    vertexList[count++] = myVertex;  

}  

void myGraph::addEdge(int a, int b){ 
    adjMatrix[a][b] = 1; 
    adjMatrix[b][a] = 1;  

}  

int myGraph::adjUnvisited(int index){ 
    for(int i=0; i<vertices; i++){ 
     if(adjMatrix[i][index]==1 && vertexList[i]->visited==false){ 
      return i; 
     } 
    } 
    return -1; 
}  

void myGraph::displayVertex(int index){ 
    std::cout << "Current vertex: " << vertexList[index]->label << std::endl; 
}  

void myGraph::dfs(){ 
    std::stack<int> myStack; 
    int temp = 0;  

    vertexList[temp]->visited = true;  

    myStack.push(temp);  

    int unvisitedVertex;  

    while(!myStack.empty()){ 
     unvisitedVertex = adjUnvisited[myStack.top()]; 
     if(unvisitedVertex!=-1){ 
      myStack.push(unvisitedVertex); 
      displayVertex(unvisitedVertex); 
      vertexList[unvisitedVertex]->visited = true; 
     }else{ 
      myStack.pop(); 
     } 
    }  

} 

Die Fehlermeldung, die ich erhalte, ist dies:

keine tragfähige überlastet '=' vertex [count ++] = myVertex;

Zusammen mit einer Anmerkung:

Kandidaten-Funktion (der impliziten Kopierzuweisungs Operator) nicht durchführbar: es gibt keine Konvertierung von 'struct Vertex *' zu 'const MyGraph :: Vertex' für erstes Argument; dereferenzieren das Argument mit * struct Vertex {

Und einige andere Fehlermeldungen, die sind (ich bin sicher, dass diese sehr klein sind und ich kann sie herausfinden):

Mitglied Referenz-Typ ‚struct Vertex‘ nicht a Zeiger; vielleicht wollten Sie '.' if (adjMatrix [i] [index] == 1 & & vertex [i] -> besucht == false) {

Bezug auf nicht-statische Elementfunktion aufgerufen werden muss unvisitedVertex = adjUnvisited [myStack.top ()];

Jetzt bin ich mir nicht sicher, was genau ich falsch mache und fragte mich, ob jemand hier mir helfen könnte.

Vielen Dank für Ihre Hilfe!

+0

Ihr privates Mitglied 'vertexList' ist eine Liste konkreter Vertex-Objekte, während Sie versuchen, einen Vertex-Zeiger zu diesem Array hinzuzufügen. Welches ist genau das, was der Fehler sagt. –

+1

Übrigens, anstelle von 'typedef struct Vertex {char label; bool besucht; } Vertex; 'Sie können einfach sagen: struct Vertex {char label; bool besucht; }; '. Strukturen sind in C++ automatisch unqualifizierte Typen. (Dies hängt jedoch nicht mit Ihrem Problem zusammen.) – Kundor

Antwort

1

Sie haben vertexList als Zeiger auf Vertex deklariert - das ist fair genug, da es sich um ein Array handelt. Das bedeutet aber, dass jedes Element dieses Arrays eine Vertex Struktur ist - dennoch greifen Sie auf jedes Array-Element zu, als wäre es ein Zeiger.

Entweder:

  • Ersetzen Sie alle -> s mit . s und etwas anderes tun in AddVertex()
  • vertexList Deklarieren als Vertex ** (wie adjMatrix)
+0

Deklarieren von VertexList als Vertex ** hat den Trick gemacht! Vielen Dank – Red