2017-09-28 4 views
-2

Ich bin relativ neu in C++. Ich versuche eine Grafikklasse zu erstellen. Ich versuche, einen Vektor von den Scheiteln in dem Grafik-Konstruktor zu erstellen, aber ich bin ein nicht definierte Bezeichner Fehler bekommen, wenn ich Vector.push_backPutting ein Objekt in einen Vektor, undefined Bezeichner

#include <iostream> 
#include <string> 
#include <vector> 

class Graph { 
public: Graph(int vertexNum) { 
    for (int i = 0; i < vertexNum - 1; i++) 
     Vertex vert(i); 
     this->vertexList.push_back(vert); 
    } 
    private: 
    class Vertex { 
     public: 
     Vertex(int vertexId) { 
      this->vertId = vertexId; 
     } 
     int vertId; 
    }; 


    std::vector<Vertex> vertexList; 
}; 

Ich bin sicher, nenne es gibt auch andere Logikfehler in dem Code, den ich haven Noch nicht behoben, ich arbeite immer noch daran, aber ich würde gerne wissen, was ich falsch mache mit dem Vektor.

Hier sind die Fehler discriptions:

Kennung "vert" ist nicht definiert dijkstra main.cpp 9
'vert': nicht deklarierter Bezeichner dijkstra main.cpp 9

+2

Bitte [lesen Sie, wie gut Fragen stellen] (http://stackoverflow.com/help/how-to-ask), und bearbeiten Sie Ihre Frage ein [Minimal, vollständig und prüfbare Beispiel] (http umfassen: //stackoverflow.com/help/mcve). Zeigen Sie auch die * tatsächlichen * Fehler, kopieren-eingefügt als Text, vollständig und ohne Änderungen. –

+0

Wenn Sie mehrere Fehler haben, beginnen Sie immer mit der Lösung des ersten Fehlers. C++ - Fehler haben die Tendenz, Kaskaden von anderen Fehlern zu verursachen, die die Nebenwirkungen des ersten sind. – molbdnilo

+0

In welchem ​​Teil des Codes versuchen Sie die 'Vector.push_back()' Funktion aufzurufen? und wie nennst du es? mit welchem ​​Parameter? Es kann viele Gründe geben, einen undefinierten Bezeichnerfehler zu erhalten. Könnten Sie uns mehr von Ihrem Code zeigen? – Actarus

Antwort

1

In C++, bevor Sie eine Variable verwenden Sie müssen es sogar in Klassendefinitionen deklarieren, indem Sie einfach die Deklaration des std :: vector über den Konstruktor verschieben, wo es verwendet wird, um diesen Fehler zu beheben. Aus diesem Grund erstellen Benutzer normalerweise einen Header für die Klasse, sodass alle Deklarationen darin ausgeführt werden und die CPP die Implementierung enthält. In ähnlicher Weise müssten Sie das Gleiche für die Vertex-Klasse und die Edge-Klasse tun. Außerdem hängt die Graph-Implementierung vom Vorhandensein der Vertex-Klasse ab, sodass die Vertex-Klasse vor der Graph-Implementierung deklariert und implementiert werden muss. Auch was noch wichtiger ist vergessen Sie Klammern um die for-Schleife zu setzen, die das Hauptproblem ist

#include <iostream> 
#include <string> 
#include <vector> 
    class Graph { 
     private: 
     class Vertex { 
      public: 
      int vertId; 
      Vertex(int vertexId) { 
       this->vertId = vertexId; 
      } 

     }; 

     class Edge { 
      public: 
       Vertex* start; 
       Vertex* end; 
       int weight; 
       Edge(Vertex* start, Vertex* end, int weight) { 
        this->start = start; 
        this->end = end; 
        this->weight = weight; 
       } 

     }; 

     public: 
     std::vector<Vertex> vertexList; 
     Graph(int vertexNum) { 
     for (int i = 0; i < vertexNum - 1; i++) { 
      Vertex vert(i); 
      this->vertexList.push_back(vert); 
      } 
     } 
    }; 
+0

Vielen Dank! Du hattest recht, die Zahnspange hat das Problem behoben. Ich habe in letzter Zeit viel Python geschrieben und es ist mir völlig in den Sinn gekommen. Soll ich Vertex und Edge in separate Klassen aufteilen oder würde Graph in .h und .cpp aufgeteilt werden? – fkInTheCoffee

+0

Wenn Sie die Klasse in h und cpp aufteilen, wird der Code leichter lesbar. Wenn Sie sie nicht teilen, erhalten Sie die Mehrfachdefinitionsfehler beim Kompilieren, wenn Sie diese Klasse mehrfach in andere Objektdateien einschließen. Die beste Vorgehensweise besteht darin, sie aufzuteilen, um dies zu vermeiden. Kann ich dort abstimmen? –

1

Dies ist ein Fall, in dem Einzug von Bedeutung ist. Sie haben keine Klammern in Ihrer for-Schleife, so verstanden wie seine

for (int i = 0; i < vertexNum - 1; i++) { 
    Vertex vert(i); 
} 
this->vertexList.push_back(vert); 

Wo es nun Sinn macht, dass vert nicht definiert ist.

Verwandte Themen