Floyd, Operatorüberlung >>



  • Ich hab alles so gemacht, wie du gesagt hast.

    So sieht meine AUsgabefkt. aus.

    ostream& operator<<(ostream& os, const Graph& am)
    {
    	os<<"Entfernungen:"<<endl;
    	os<<am.at(0,0);
    	return os;
    };
    

    Bei "os<<am.at(0,0);" kommt dann aber folgende Fehlermeldung:

    error C2662: 'Graph::at': this-Zeiger kann nicht von 'const Graph' in 'Graph &' konvertiert werden



  • Wenn du mit const Graph arbeitest, benötigst du noch eine konstante Version der at()-Methode (zusätzlich zu der vorhandenen):

    class Graph
    {
    public:
      ...
      int at(int x,int y) const
      {
        return matrix[sp+zl*mat_breite];
      }
      ...
    };
    

    (ja, da steht das selbe drin wie in der anderen Version - aber wichtig sind hier der unterschiedliche Rückgabetyp und das "const")



  • Ok, jetzt kommt zwar kein Compile-Fehler mehr, aber beim Ausführen kommt ein Fehler und das Programm bricht ab.

    Fehler kommt an der Stelle "return matrix[sp+zl*mat_breite];"



  • rgHorus schrieb:

    Fehler kommt an der Stelle "return matrix[sp+zl*mat_breite];"

    Nächste Frage: Wie lautet dieser Fehler? Und welchen Wert spuckt der Debugger für die beteiligten Variablen aus?



  • Fehlermeldung:
    Unbehandelte Ausnahme bei 0x004013a6 in Graph.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0x00000000.

    mat_breite -858993460 int
    - matrix 0xcccccccc int *
    CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden int
    sp 1 int
    - this 0x0012feac {am=0x00321180 zm=0x00322cf8 n=6 ...} const Graph * const
    - am 0x00321180 double * *
    - 0x003211d8 double *
    -1.0000000000000000 double
    - zm 0x00322cf8 double * *
    - 0x00322d50 double *
    -1.0000000000000000 double
    n 6 unsigned int
    - matrix 0xcccccccc int *
    CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden int
    mat_breite -858993460 int
    zl 1 int



  • Das sieht ganz so aus, als ob du deinen Graph nicht richtig initialisiert hast. Von wo aus wird der Operator denn aufgerufen?

    (nur zur Sicherheit - was für Konstruktoren hast du definiert?)



  • Konstruktor von Graph:

    class Graph
    {
    private:
    ...
    public:
    	//Konstruktor
    	Graph(size_t n);
    ...
    };
    
    Graph::Graph(size_t n):n(n)
    {
    	cout<<"Konstruktor von Graph"<<endl;
    
    	am=new double *[n];
    	for(size_t i=0;i<n;i++)
    	{
    		am[i]=new double	[n];
    		for(size_t k=0; k<n; k++)
    		{
    			am[i][k]=-1;
    		}
    	}
    
    	zm=new double *[n];
    	for(size_t i=0;i<n;i++)
    	{
    		zm[i]=new double	[n];
    		for(size_t k=0; k<n; k++)
    		{
    			zm[i][k]=-1;
    		}
    	}
    
    };
    


  • Wenn du deine Matrix in 'am' und 'zm' untegebracht hast, mußt du aus der at()-Methode heraus auch diese Elemente verwenden.



  • Mmmhh. Aber wie soll ich das jetzt machen. 😕

    Ist jetzt die Variable "int *matrix" unnötig? Problem ist bloß, dass ich am als "double **am" deklariert habe!



  • Problem gelöst - danke!


Anmelden zum Antworten