2016-09-27 3 views
-1

Ich bin ziemlich neu in C++ und ich habe wirklich Schwierigkeiten mit dem Versuch, eine einzelne Instanz einer Klasse ConflictGraph zu definieren und Zugriff auf seine Methoden von verschiedenen Methoden innerhalb einer anderen Klasse ConvexHullBuilder.'Class Instance Object' wurde in diesem Bereich nicht deklariert

Aus Gründen das Problem, ich brauche in ConvexHullBuilder::computeConvexHull()ConflictGraph auf einen bestimmten Punkt zu initialisieren, wenn ich ein paar Ecken haben und ein dcel, dann muss ich ConflictGraph's initialize() rufen richtig die ConflictGraph zu initialisieren. Das funktioniert gut. Das Problem tritt auf, wenn ich versuche, ConflictGraphs lookForVisibleFaces() innerhalb ConvexHullBuilder::finalizeConvexHull aufzurufen.

bekomme ich folgende Fehler

error: ‘conflictGraph’ was not declared in this scope

facesVisible = conflictGraph.lookForVisibleFaces(remainingVertices[i]);

   ^

Die Typen ein bisschen schwierig, aber nicht darauf achten zu ihnen. Ich brauche nur einen Einblick darüber, wie externe Klassenmethoden innerhalb des inneren Klassenmethoden für den Zugriff auf

ConflictGraph.h:

class ConflictGraph{ 
public: 
    ConflictGraph(DrawableDcel* dcel, std::vector<Dcel::Vertex*> vertices); 
    void initializeConflictGraph(); 
    std::set<Dcel::Face*>* lookForVisibleFaces(Dcel::Vertex*); 
private: 
    DrawableDcel *dcel; 
    std::vector<Dcel::Vertex*> tetrahedronVertices; 

    void checkVisibility(); 

} 

ConflictGraph.cpp:

#include "conflictgraph.h" 

/** 
* @brief ConflictGraph::ConflictGraph() Constructor 
* @params takes dcel and tetrahedron vertices as input 
*/ 
ConflictGraph::ConflictGraph(DrawableDcel* dcel, std::vector<Dcel::Vertex*> tetrahedronVertices){ 
    this->dcel = dcel; 
    this->tetrahedronVertices = tetrahedronVertices; 
} 

/** 
* @brief ConflictGraph::initializeConflictGraph() initializes the conflict graph 
*/ 
void ConflictGraph::initializeConflictGraph(){ 
    //Check which faces see which vertices and viceversa 
    checkVisibility();//Works 
} 

/** 
* @brief lookForVisibleFaces(Dcel::Vertex* vertex) finds which faces are visible from a given vertex 
* @param VERTEX vertex given vertex 
* @retuns map of visible faces and passed Vertex 
*/ 
std::set<FACE>* ConflictGraph::lookForVisibleFaces(Dcel::Vertex* vertex){ 
. . . 
} 

ConvexHullBuilder.h:

#include "conflictgraph.h" 

class ConvexHullBuilder{ 

public: 
    ConvexHullBuilder(DrawableDcel* dcel); 
    void computeConvexHull(); 

private: 
    DrawableDcel *dcel; 
    void finalizeConvexHull(std::vector<Dcel::Vertex*); 
}; 

ConvexHullBuilder.cpp

#include "convexhullbuilder.h" 

/** 
* @brief ConvexHullBuilder::ConvexHullBuilder() Conmstructor 
* @params takes dcel as input 
*/ 
ConvexHullBuilder::ConvexHullBuilder(DrawableDcel* dcel){ 
    this->dcel = dcel; 
} 

/** 
* @brief ConvexHullBuilder::computeConvexHull() takes dcel as input. 
*  Starts the algorithm calling all the different functions needed. 
*  Adds Vertices, Builds a Tetrahedron . . . 
*/ 
void ConvexHullBuilder::computeConvexHull(){ 
. . . 
/** VerticesForCG is an array of pointers to vertex, properly filled 
    allVertices contains all the remaining vertices**/ 
//Initializes Conflict Graph with Dcel And First 4 Vertices 
    ConflictGraph conflictGraph = ConflictGraph(dcel, verticesForCG); 
    conflictGraph.initializeConflictGraph(); //Works 

    //Loop through remaining vertices 
    finalizeConvexHull(allVertices);//Does not Work 

} 

/** 
* @brief ConvexHullBuilder::finalizeConvexHull starts last phase to build the convex hull 
* @param VERTEX_POINTERS_LIST remainingVertices i=4 -> n vertices 
*/ 
void ConvexHullBuilder::finalizeConvexHull(std::vector<Dcel::Vertex* remainingVertices){ 

    //Loop through remaining vertices 
    for(unsigned int i=4; i<remainingVertices.size(); i++){ 

     //Initializing faces visible by a vertex 
     std::set<Dcel::Face*>* facesVisible; 

     //Check Which faces sees i-Vertex and assigning them 
     facesVisible = conflictGraph.lookForVisibleFaces(remainingVertices[i]);//Error 

    } 
} 

EDIT

Ich habe auch versucht ConflictGraph Instanz in ConvexHullBuilder.h wie

private: 
    DrawableDcel *dcel; 
    ConflictGraph *conflictGraph; 

Und in ConvexHullBuilder.cpp vorbei:

{ 
    //Initializes Conflict Graph with Dcel And First 4 Vertices 
    this->conflictGraph = new ConflictGraph(dcel, verticesForCG); 
    conflictGraph->initializeConflictGraph(); 

    //Loop through remaining vertices 
    finalizeConvexHull(allVertices); 
} 

{ 
    facesVisible = conflictGraph->lookForVisibleFaces(remainingVertices[i]); 
} 

Aber in ConvexHullBuilder.h ich:

ConflictGraph does not name a type

Ich habe versucht, einen Blick auf andere Antworten auf SO nehmen, aber ich war nicht in der Lage, mit ihnen mein Problem zu lösen.

Was verursacht diesen Fehler? Wie kann ich das verhindern? Wie kann ich verschiedene externe Klassenmethoden für innere Klassen verschiedener Methoden verwenden?

+0

So viel Code. Wo ist dein [MCVE]? –

+0

Viel Code? Ich lege nur das Kernstück von Codes. Die meisten Zeilen sind Kommentare, die versuchen, den Zweck des Algorithmus zu erklären. Wenn Sie denken, dass sie nutzlos sind, ist es eine andere Sache. – AndreaM16

+0

Sie benötigen keine vier Dateien, um dieses Problem zu reproduzieren. Teil des Debuggens ist _minimizing_ your code. Lesen Sie die "[MCVE]" Seite bitte ich habe es nicht nur zum Spaß verlinkt. –

Antwort

0

ich geschafft, sol Dieses Problem Es wurde in beiden Klassen von includes verursacht. Ich brauchte include eine bestimmte module nur auf der header der Klasse included. Zum Beispiel musste ich die Includes nur unter ConflictGraph.h und nicht auch in ConvexHullBuilder machen.

Hier ist, wie ich in der Lage bin ConflictGraph zugreifen ‚s verschiedene Methoden aus dem Inneren ConvexHullBuilder Funktionen

ConvexHullBuilder.h:

private: 
    . . . 
    ConflictGraph *conflictGraph; 

ConvexHullBuilder.cpp:

void ConvexHullBuilder::computeConvexHull(){ 

    conflictGraph = new ConflictGraph(dcel, params); 

    conflictGraph->initializeConflictGraph(); 
    finalizeConvexHull(parameters); 

} 

void ConvexHullBuilder::finalizeConvexHull(myType parameters){ 

    conflictGraph->lookForVisibleFaces(someParams); 
} 
+0

Beachten Sie, dass dadurch Speicher verloren geht, da jedes Mal, wenn "computeConvexHull" aufgerufen wird, Speicher für ein "ConflictGraph" -Objekt neu zugewiesen wird und der Zeiger auf den zuvor zugewiesenen "ConflictGraph" weggeworfen wird. Sie sollten 'conflictGraph' auf 'nullptr' (oder' NULL' vor C++ 11) im Konstruktor 'ConvexHullBuilder' initialisieren, dann in' computeConvexHull' prüfen, ob 'conflictGraph == nullptr' ist und falls nicht, dann löschen Sie vor dem Aufruf von 'new', oder einfach das vorhandene Objekt wiederverwenden. Wenn "conflictGraph" während der Zerstörung von "ConvexHullBuilder" nicht NULL ist, lösche es dann. –

+0

Vielen Dank @DavidScarlett, ich muss überprüfen, wie Speicher tatsächlich freigegeben wird. Ich programmiere buchstäblich in C++ von 5 Tagen vielleicht. – AndreaM16

+0

In diesem Fall sollten Sie die Klasse strukturieren, um die Verwendung des neuen Operators zu vermeiden, der die Gefahr von Speicherlecks birgt. Überlegen Sie, wie lange das ConflictGraph-Objekt benötigt wird. Wird es für die gesamte Lebensdauer des ConvexHullBuilder-Objekts oder nur während des Methodenaufrufs computeConvexHull benötigt? Dies gibt vor, ob es ein Klassenmitglied oder lokal deklariert und als Funktionsparameter übergeben werden soll. Aber wenn es ein Klassenmitglied gemacht wird, muss es im Konstruktor initialisiert werden, und wenn 'dcel' und' params' dann nicht verfügbar sind, hat ConflictGraph eine Methode, um sie später zu setzen? –

1

Sie versuchen, cinflictGraph innerhalb finalizeConvexHull zu verwenden. Es wurde jedoch in computeConvexHull deklariert. Mitgliedsfunktionen teilen keine lokale Ressource untereinander.

Lösung:

Eine mögliche Lösung ohne einen tiefen Gedanken in Ihr System zu machen ist conflictGraph als privates Variable der Klasse ConvexHullBuilder zu erklären. Sie können es also in beiden Elementfunktionen verwenden.

+0

Ich werde meine Frage bearbeiten. Ich habe deine Lösung ausprobiert und bekomme: 'conflictGraph ist kein Typ'. – AndreaM16

+0

Diese spezielle Lösung hinzugefügt. – AndreaM16

+0

@ AndreaM16 Sie brauchen nicht das "*" in der Deklaration –

1

conflictGraph ist in der Methode ConvexHullBuilder::computeConvexHull() als eine lokale Variable deklariert, so dass es nur existiert, während diese Funktion aufgerufen wird. und ist nur innerhalb dieser Funktion zugänglich. finalizeConvexHull wird von computeConvexHull aufgerufen, so dass conflictGraph mindestens zum Zeitpunkt des Aufrufs vorhanden ist, aber damit finalizeConvexHull auf es zugreifen können, müssten Sie es als Parameter an diese Funktion übergeben.

1

Der Gültigkeitsbereich einer Variablen ist immer der Block, in dem sie sich befindet.

müssen Sie Ihre conflictGraph in der zweiten Funktion deklarieren.

1

Sie benötigen

private: 
ConflictGraph conflictGraph; 

in "ConvexHullBuilder.h" file "ConvexHullBuilder.cpp"

Und erklären in der Datei zu deklarieren:

ConvexHullBuilder::ConvexHullBuilder(DrawableDcel* dcel){ 
    this->dcel = dcel; 
    conflictGraph = ConflictGraph(dcel, verticesForCG); 
} 

Dann können Sie conflictGraph Objekt verwenden in jeder Funktion innerhalb "ConvexHullBuilder.cpp" Datei

+0

Das Problem ist, dass ich diese Initialisierung tun muss, nachdem 'verticesForCG' durch mehrere Algorithmen gesetzt wurde. Also ich kenne seinen Wert für den Konstruktor nicht.Wenn ich das tue, bekomme ich: 'VerticesForCG' wurde in diesem Bereich nicht deklariert. – AndreaM16

+0

So können Sie "conflictGraph = ConflictGraph (dcel, verticesForCG)" deklarieren; Sobald Sie das VerticesForCG-Array initialisiert haben. Ich sollte dann arbeiten. – Amol

+0

Ich mache das, aber ich bekomme diesen Fehler. Ich denke, ich muss auf 'ConflictGraph's Methoden innerhalb der' ConvexHullBuilder' Methode zugreifen, wo ich es initialisiere oder es immer innerhalb jeder Methode reinitialisiere. Trotzdem danke. – AndreaM16

Verwandte Themen