error C2062: type 'int' unexpected
-
Hallo ich bekomme folgende Fehler und weiß nicht wo die Ursache dafür liegt :
edge.h : error C2062: type 'int' unexpected edge.h : error C2334: unexpected token(s) preceding ':'; skipping apparent function body edge.h : error C2061: syntax error : identifier 'Vertex'Hier mein Quelltext zu edge.h :
#ifndef _MYEDGE_ #define _MYEDGE_ #include "base.h" #include "vertex.h" using namespace std; class Edge : public Base { private: int length; public: //Leerer Konstruktor Edge() : Base() { this->setLength(0); }; HIER MECKERT ER ÜBER DEN INT WERT : Edge(int edgelength,Vertex* vtx=PSEUDO,Edge* nedge=PSEUDO) : Base(vtx,nedge) { this->setLength(edgelength); }; //Kopierkonstruktor Edge(Edge* e) : Base( ((Vertex*)(e->getBaseOne())) , ((Edge*)(e->getBaseTwo())) ) { this->setLength(e->getLength()); }; //Gibt die Vertex zurück, auf die diese Ecke hinläuft Edge* getVertex() { return (Vertex*)this->getBaseOne(); }; HIER MECKERT ER ÜBER DEN IDENTIFIER VERTEX : //Setzt die Vertex, auf die diese Ecke hinläuft void setVertex(Vertex* toset) { this->setBaseOne(toset); }; //Gibt die nächste Edge zurück Edge* getEdge() { return (Edge*)this->getBaseTwo(); }; //Setzt die nächste Edge void setEdge(Edge* etwo) { this->setBaseTwo(etwo); }; //Gibt das Gewicht bzw. die Länge der Edge zurück int getLength() { return this->length; }; //Setzt das Gewicht bzw. die Länge der Edge void setLength(int length) { this->length = length; }; }; #endifVertex
#ifndef _MYVERTEX_ #define _MYVERTEX_ #include "base.h" #include "edge.h" using namespace std; class Vertex : public Base { private: string cityname; public: Vertex() : Base(){ cityname = ""; }; Vertex(string cityname) : Base(){ this->setCityName(cityname); }; Vertex(Vertex* v) : Base(v->getNextVertex(),v->getEdge()){ this->setCityName(v->getCityName()); }; Vertex* getNextVertex(){ return (Vertex*)getBaseOne(); }; Edge* getEdge(){ return (Edge*)getBaseTwo(); }; Edge* getEdge(int i){ Edge* current = this->getEdge(); for(int k=0;k<i;k++) { current = current->getEdge(); if(current == PSEUDO) return PSEUDO; } return current; }; string getCityName(){ return this->cityname; }; void setCityName(string name){ this->cityname = name; }; void addToEdgeList(Edge* atel){ }; void setVertex(Vertex* vlr){ this->setBaseOne(vlr); }; void setEdgeRoot(Edge* elr){ this->setBaseTwo(elr); }; }; #endifBase
#ifndef _MY_BASE_ #define _MY_BASE_ #define PSEUDO NULL using namespace std; class Base { private: Base* one; Base* two; public: Base(){ one = PSEUDO; two = PSEUDO; }; Base(Base* one,Base* two){ this->one = one; this->two = two; }; ~Base(){ }; Base* getBaseOne(){ return one; }; Base* getBaseTwo(){ return two; }; void setBaseOne(Base* one){ this->one = one; }; void setBaseTwo(Base* two){ this->two = two; }; }; #endif
-
hinter einer Funktion (in dem Fall der Default-Ctor) gehört eigentlich kein ;
-
CStoll schrieb:
hinter einer Funktion (in dem Fall der Default-Ctor) gehört eigentlich kein ;
es ist nicht notwendig, aber auch kein fehler.
-
Möglicherweise fehlt aber in einer der anderen Dateien ein Semikolon am Ende einer Klassendeklaration.
-
MFK schrieb:
Möglicherweise fehlt aber in einer der anderen Dateien ein Semikolon am Ende einer Klassendeklaration.
Ich denke nicht...
Ich poste mal die anderen Files
-
vertex.h und edge.h binden sich gegenseitig ein. Das funktioniert nicht. Ich denke, in vertex.h sollten auch Vorwärtsdeklarationen von Base und Edge ausreichen.
-
MFK schrieb:
vertex.h und edge.h binden sich gegenseitig ein. Das funktioniert nicht. Ich denke, in vertex.h sollten auch Vorwärtsdeklarationen von Base und Edge ausreichen.
Wie meinst du soll ich nun einbinden ?
in vertex.h : base.h und edge.h
und in edge.h : nur base.h ?Aber edge.h "weiß" doch dann garnichts von Vertex , obwohl er Pointer darauf zurückgibt.
Das hab ich jetzt mal so gemacht und bekomme die gleichen Fehler
-
dazu eine vorwärtsdeklaration von vertex
class Vertex;in edge.h
-
Bei Pointern ist keine Definition nötig, kannst auch die Header weg lassen. Muß nur ne Forward-Deklaration da sein, da ein Pointer immer gleich groß ist, braucht der Compiler die Informationen des Typs nicht.
-
camper schrieb:
dazu eine vorwärtsdeklaration von vertex
class Vertex;in edge.h
Jetzt bringt er das :
edge.h(26) : error C2664: 'Base::Base(Base *,Base *)' : cannot convert parameter 1 from 'Vertex *' to 'Base *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast edge.h(32) : error C2664: 'Base::Base(Base *,Base *)' : cannot convert parameter 1 from 'Vertex *' to 'Base *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast edge.h(45) : error C2664: 'Base::setBaseOne' : cannot convert parameter 1 from 'Vertex *' to 'Base *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style castKenne mich mit dem vorwärtscast wie du es sagst wohl nicht wirklich aus.
-
stimmt, für konversionen von derived nach base muss er die definition von derived (also vertex) schon mal gesehen haben. du müsstest folglich die funktionen ausserhalb der klassendefinion definieren nachdem du vertex.h eingebunden hast. evtl. liegt hier auch ein designfehler vor.
-
camper schrieb:
stimmt, für konversionen von derived nach base muss er die definition von derived (also vertex) schon mal gesehen haben. du müsstest folglich die funktionen ausserhalb der klassendefinion definieren nachdem du vertex.h eingebunden hast. evtl. liegt hier auch ein designfehler vor.
Also an einen Designfehler glaub ich nicht :
Also ich versuche mal zu erklären was ich so bezwecke :
Das ganze soll wie viele warscheindlich schon gemerkt haben ein graph werden (nur Übung macht den Meister *gg*).
Base ist die Basisklasse zu Vertex und Edge
Jeder Vertex hat einen Pointer auf eine Ecke(Eckenliste) und einen Pointer auf eine Kante (Also eine Kantenliste).
Die Ecke wiederum hat einen Pointer auf eine Ecke und eine Kante.graph -> Vertex1 -> Vertex2 -> Vertex3
Vertex1 ->Edge1
Edge1 -> Vertex2 und Edge1 -> Edge2Vertex2 -> Edge1
Edge1 -> Vertex1 und Ege1 -> Edge3
usw.
-
camper schrieb:
stimmt, für konversionen von derived nach base muss er die definition von derived (also vertex) schon mal gesehen haben. du müsstest folglich die funktionen ausserhalb der klassendefinion definieren nachdem du vertex.h eingebunden hast. evtl. liegt hier auch ein designfehler vor.
Also ich hab jetzt mal noch was umgeschrieben und hab Vertex* und/oder Edge* durch Base* ersetzt.
So lässt es sich wenigstens kompilieren.
Dies ist aber irgendwie wenig zufriedenstellendedge.h
#ifndef _MYEDGE_ #define _MYEDGE_ #include "base.h" using namespace std; class Edge : public Base { private: int length; public: //Leerer Konstruktor Edge() : Base() { this->setLength(0); }; //Konstruktor um eine Edge mit einer Länge anzulegen Edge(int edgelength,Edge* vtx=PSEUDO,Edge* nedge=PSEUDO) : Base(vtx,nedge) { this->setLength(edgelength); }; //Kopierkonstruktor Edge(Edge* e) : Base( ((Vertex*)(e->getBaseOne())) , ((Edge*)(e->getBaseTwo())) ) { this->setLength(e->getLength()); }; //Gibt die Vertex zurück, auf die diese Ecke hinläuft Vertex* getVertex() { return (Vertex*)this->getBaseOne(); }; //Setzt die Vertex, auf die diese Ecke hinläuft void setVertex(Vertex* toset) { this->setBaseOne(toset); }; //Gibt die nächste Edge zurück Edge* getEdge() { return (Edge*)this->getBaseTwo(); }; //Setzt die nächste Edge void setEdge(Edge* etwo) { this->setBaseTwo(etwo); }; //Gibt das Gewicht bzw. die Länge der Edge zurück int getLength() { return this->length; }; //Setzt das Gewicht bzw. die Länge der Edge void setLength(int length) { this->length = length; }; }; #endifvertex.h
#ifndef _MYVERTEX_ #define _MYVERTEX_ #include "base.h" using namespace std; class Vertex : public Base { private: string cityname; public: Vertex() : Base(){ cityname = ""; }; Vertex(string cityname) : Base(){ this->setCityName(cityname); }; Vertex(Vertex* v) : Base(v->getNextVertex(),v->getEdge()){ this->setCityName(v->getCityName()); }; Vertex* getNextVertex(){ return (Vertex*)getBaseOne(); }; Base* getEdge(){ return this->getBaseTwo(); }; Base* getEdge(int i){ Base* current = this->getEdge(); for(int k=0;k<i;k++) { current = current->getBaseTwo(); if(current == PSEUDO) return PSEUDO; } return current; }; string getCityName(){ return this->cityname; }; void setCityName(string name){ this->cityname = name; }; void addToEdgeList(Base* atel){ if(this->getEdge() == PSEUDO) { this->setEdgeRoot(atel); } else { Base* oldRoot = this->getEdge(); this->setEdgeRoot(atel); atel->setBaseTwo(oldRoot); } }; void setVertex(Vertex* vlr){ this->setBaseOne(vlr); }; void setEdgeRoot(Base* elr){ this->setBaseTwo(elr); }; }; #endifNaja wie gesagt so wäre es nun teilweise mögliche einfach einen Base* zu übergeben anstatt einen Vertex* bzw. einen Edge*
Kann mir noch jemand weiterhelfen ?