Operator + für eine Vectorklasse überladen



  • Hallo, ich möchte den Operator + für eine Vectorklasse überladen.

    Nun habe ich im Internet 2 verschiedene Versionen gefunden wie das geht

    SF3dVector operator+ (SF3dVector v, SF3dVector u)
    {
    	SF3dVector res;
    	res.x = v.x+u.x;
    	res.y = v.y+u.y;
    	res.z = v.z+u.z;
    	return res;
    }
    
    Vector3D operator + (const Vector3D &vec) 
    { 
        return Vector3D(x + vec.x, y + vec.y, z + vec.z);
    }
    

    Also die erste Version benutzt 2 Pararmeter.

    Die zweite Version benutzt nur einen Parartmeter (als const Referenz) und benutzt das x der eigenen Klasse (welches ja sogar privat sein kann)

    Welche Version ist besser? (Und warum?)



  • die erste ist besser, wenn siue noch ein wenig aufgemotzt wird.

    SF3dVector{
    ...
       SF3dVector& operator+=(SF3dVector& v)
    ...
       friend SF3dVector operator+ (SF3dVector const& v, SF3dVector const& u){
             return SF3dVector(v)+=u;
    	//SF3dVector res(v);
             //res+=u;
    	//return res;
       }
    }
    


  • OK, jetzt habe icjh mich für die erste Version entschieden, aber bekomme als Fehler:

    "error C2804: Binärer Operator '+' hat zu viele Parameter"

    Jetzt verstehe ich überhaupt nix mehr.
    Warum geht das bei denen im Beispiel 1 und bei mir nicht?



  • hast du denn auch brav friend davorgeschrieben oder den operator außerhalb der klasse platziert? weil wenn du das nicht machst, nimmt er den ersten parameter als this. und braucht deswegen nur einen zweiten übergeben zu bekommrn.



  • hey volkhard
    wie würdest du das problem lösen, wenn auch gemischte arithmetik mit scalen möglich sein soll.

    vector<int> v(1,1);
    
    vector<int> a = v + 10;
    vector<int> b = 10 + v;
    vector<int> c = v + 10 + v;
    

    wohl kaum mit eine implizite typumwandlung von T nach vector in form vom

    template<typename T>
    class vector 
    {
    ...
    public:
    vector(const T bla) //nicht explicit
    : x(bla), y(bla)
    {
    }
    

    oder?

    würde mich interessieren wie du das machen würdest.



  • ich würde mir todd veldhuizens artikel über expression templates nochmal zu gemüte führen und anfangen. kurz danach würde ich bei blitz++ vorbeischauen für noch ein paar coole tricks.
    aber ich weiß gar nicht, was die bedeutung von

    vector<int> v(1,1);
    vector<int> a = v + 10;
    

    sein soll. wenn die bedeutung da ist, gibts vielleicht anwendungsspezifische tricks, die eh viel stärker als jede mikrooptimierung sind.



  • danke für deine antwort.
    blitz++ hört sich n1 an, werd ich mir mal anschauen;
    den artikel ebenfalls


Anmelden zum Antworten