friends und operator-overloading



  • Hallo ich eine Matrix und eine VektorKlasse geschrieben. Nun möchte ich eine Multiplikation von Vektor und Matrix implementieren.

    Ich habe im Stroustrup das Kapitel über Operatoroverloading gelesen, und da wird für genau diese Methode eine Realisierung über Friends vorgeschlagen. Ich hab das versucht, aber leider klappt es nicht.

    Ich würde gerne die Unterteilung Header(Rümpfe und Deklaration) und SourceFiles(Implementation beibehalten)

    Hier die Header von meinen 2 Klassen.

    Header Matrix-Klasse

    #pragma once
    #include <iostream>
    namespace MRTR
    {	
    	class Vector;    //Forward-Deklaration
    	class Matrix
    	{				
    	public:			
    		Matrix();
    		Matrix(float data[]);
    		/////
    
    		Matrix operator*(const Matrix& m1);		
    		friend Vector operator*(const Matrix&, const Vector&);
    	private:				
    		float m_contents[16];	
    
    	};
    }
    

    Header Vektor Klasse

    #pragma once
    namespace MRTR
    {
    	class Vector
    	{
    	public:		
    		class Matrix;   //Forward-Deklaration
    		Vector();		
    		friend Vector operator*(const Matrix&, const Vector&);
    	private:		
    		float m_components[4];
    	};
    
    }
    

    In den cpp-Files hab ich dann jeweils beide Header included. Die Implementierung des Operators hab ich dann in das cpp-file der VektorKlasse geschrieben.
    Leider findet er dann den Operator nicht in meinem Testprog.
    Was mach ich falsch?



  • friend heißt nur, dass die andere Klasse alle elemente aus der eigenen klasse bzw. speziell deklarierte elemente benutzen darf, es wird nicht die funktion/das member implementiert!! das ist sache von vererbung!

    außerdem schreibst du

    friend Vector operator*(const Matrix&, const Vector&);
    

    hast aber nur die funktion operator * (const Matrix & ml) implementiert?? du musst dann schon die obige funktion implementieren!



  • also ich hab natürlich beide operatoren implementiert. Den Operator mit dem Matrizen multipliziert werden, hab ich in dem source der MatrixKlasse implementiert.

    Den Operator mit dem Vector und Matrix multipliziert werden nur in der Vektorklasse.

    Vector operator*(const Matrix& m, const Vector& v)
    {
    Vector test;

    return test;
    }

    Mittlerweile kompiliert mein Testprogramm auch, d.h er findet den Operator für Matrix * Vektor.

    Leider bekomm ich beim bauen, n Linkerfehler. D.h er weiss zwar das eine Methode existiert die so heißt, aber er kann die Implementation nicht zuordnen.

    Ist das jetzt ne VC++ Sache, oder was muss ich machen damit der Deklaration auch die Implementation im Source zugeordnet werden kann.



  • Sicher, dass du den Operator auch im Namensraum MRTR definierst?



  • Helium schrieb:

    Sicher, dass du den Operator auch im Namensraum MRTR definierst?

    Danke, genau das war das Problem. 🙂


Anmelden zum Antworten