error C2062: type 'int' unexpected



  • 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


  • Mod

    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 cast
    

    Kenne mich mit dem vorwärtscast wie du es sagst wohl nicht wirklich aus.


  • Mod

    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 -> Edge2

    Vertex2 -> 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 zufriedenstellend

    edge.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;
    	};
    };
    
    #endif
    

    vertex.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);
    	};
    };
    
    #endif
    

    Naja 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 ?


Anmelden zum Antworten