Objekte als Parameter



  • Hallo,

    ich möchte zwei Vektoren addieren. Diese zwei Vektoren gebe ich als Parameter an die funktion:

    void addition(Vector a, Vector b){
    float c1 = a.a1 + b.b1; // Ist das so richtig?
    float c2 = a.a2 + b.b2;
    float c3 = a.a3 + b.b3;  
    }
    

    main

    #include <iostream>
    #include "Vektor.h"
    using namespace std;
    
    int main()
    {
        Vektor a(1,2,3);
        Vektor b(4,5,6);
    
        a.addition(a,b); // ??? Mit welchem Objekt soll ich die Funktion aufrufen?
    
        return 0;
    }
    


  • Auf garkeinem Object sollst du die Funktion aufrufen. Außer es ist eine Methode innerhalb der Klasse, dann kannst du dir aber auch einen der beiden Parameter sparen.



  • Dann sieht mein code so aus:

    header:

    void addition(Vektor a, Vektor b);
    
    void Vektor::addition(Vector a, Vector b){
    float c1 = a.a1 + b.b1; // Ist das so richtig?
    float c2 = a.a2 + b.b2;
    float c3 = a.a3 + b.b3;  
    }
    
    #include <iostream>
    #include "Vektor.h"
    using namespace std;
    
    int main()
    {
        Vektor a(1,2,3);
        Vektor b(4,5,6);
    
        addition(a,b); // Jetzt die Fehlermeldung "Was not declared in the scope"
    
        return 0;
    }
    


  • Oder bei sowas kommt auch ein Fehler:
    error: expected unqualified-id before '.' token

    Vektor.addition(a,b);
    


  • Ne, das is Quatsch:

    //Header
    Vektor addition(Vektor other);
    
    //Source
    Vektor Vektor::addition(const Vector& other){ 
       return Vektor(this->a1 + other.a1, this->a2 + other.a2, this->a3 + other.a3);
    }
    
    //Main
    int main() 
    { 
        Vektor a(1,2,3); 
        Vektor b(4,5,6); 
    
        Vektor c = a.addition(b);
        return 0; 
    }
    

    E: Vektor als returntype vergessen



  • Nein.

    Entweder, was etwas von Java hat, du nutzt den this-zeiger als ersten Parameter oder du machst die Methode statisch bzw. als freie Funktion verfügbar.

    class Vektor
    {
    // ...
    
    public:
    	Vektor add(Vektor const& rhs)
    	{
    		return Vektor(this->x + rhs.x, this->y + rhs.y);
    	}
    
    public:
    	static Vektor addition(Vektor const& a, Vektor const& b)
    	{
    		return Vektor(a.x + rhs.x, a.y + rhs.y);
    	}
    };
    
    Vektor addition(Vektor const& a, Vektor const& b)
    {
    	return Vektor(a.x + rhs.x, a.y + rhs.y);
    }
    
    int main()
    {
    	Vektor v1(1, 2, 3);
    	Vektor v2(2, 4, 6);
    
    	Vektor statisch = Vektor::addition(v1, v2);
    	Vektor freieFunktion = addition(v1, v2);
    	Vektor member = v1.add(v2);
    
    	return 0;
    }
    


  • Verständliche Lösung tkausl. 👍

    Ich bekomme jetzt die Fehlermeldung:
    no matching function for call to 'Vektor::Vektor(Vektor)'

    Hat das etwas mit meinem default-constr und destruktor zu tun? Deren Rümpfe sind leer...



  • c++chiller schrieb:

    Hat das etwas mit meinem default-constr und destruktor zu tun? Deren Rümpfe sind leer...

    Dann lösch sie, wenn du sie nicht brauchst!



  • Immer noch die gleich Fehlermeldung.
    Warum findet er die richtige funkion denn nicht?



  • Mehr von deinem aktuellen Code bitte...



  • //header
    Vector addition(const Vector& u);
    Vektor();
    ~Vektor();
    Vektor(float a, float b, float c);
    Vektor(Vector &a);
    
    //source
    Vector::Vector(float a, float aa, float aaa){
    		this->a1=a.1;
    		this->a2=aa.1;
    		this->a3=aaa.1;
    	}
    Vektor Vektor::addition(Vebtor const& a){
            return Vektor(this->a1+a.a1, this->a2+a.a2, this->a3+a.a3);
    	}
    //main
    Vektor a(1,2,3);
        Vektor b(4,5,6);
        Vektor c = a.addition(b); //Hier kommt die Fehlermeldung
    


  • Du wirfst Vector und Vektor wild durcheinander. Ich glaube, ich habe auch einen Vebtor gesehen...



  • c++chiller schrieb:

    //header
    Vektor addition(const Vektor& u);
    Vektor();
    ~Vektor();
    Vektor(float a, float b, float c);
    Vektor(Vektor &a);
    
    //source
    Vektor::Vektor(float a, float aa, float aaa){
    		this->a1=a  //edit
    		this->a2=aa;
    		this->a3=aaa;
    	}
    Vektor Vektor::addition(Vektor const& a){
            return Vektor(this->a1+a.a1, this->a2+a.a2, this->a3+a.a3);
    	}
    //main
    Vektor a(1,2,3);
        Vektor b(4,5,6);
        Vektor c = a.addition(b); //Hier kommt die Fehlermeldung
    


  • Erkläre mir mal bitte wozu du Zeilen 4 und 6 machst.



  • Wegen der Aufgabenstellung.
    Aber wenn ich diese Zeilen rauskommentiere dann komm die gleiche Fehlermeldung.



  • c++chiller schrieb:

    Wegen der Aufgabenstellung.
    Aber wenn ich diese Zeilen rauskommentiere dann komm die gleiche Fehlermeldung.

    Dann zeig vollständigen Code noch einmal.



  • class Vektor{
    ...
    };
    


  • Vektor(Vector &a);
    

    hier fehlt ein const
    non- const Referenzen dürfen nicht an RValues (vereinfacht: "namenlose objekte", wie hier der returnwert von "addition") gebunden werden
    die kopie darf zwar wegoptimiert werden, der compiler muss aber trotzdem prüfen ob sie erlaubt wäre, wenn er sie machen würde



  • hustbaer schrieb:

    Vektor(Vector &a);
    

    hier fehlt ein const
    non- const Referenzen dürfen nicht an RValues (vereinfacht: "namenlose objekte", wie hier der returnwert von "addition") gebunden werden
    die kopie darf zwar wegoptimiert werden, der compiler muss aber trotzdem prüfen ob sie erlaubt wäre, wenn er sie machen würde

    Das ist die Lösung! Das mit const muss ich mir noch genauer angucken.
    Vielen Dank an alle!!


  • Mod

    c++chiller schrieb:

    Das ist die Lösung! Das mit const muss ich mir noch genauer angucken.
    Vielen Dank an alle!!

    void foo(int &i) { }
    void bar(const int& i) { }
    
    int main()
    {
      foo(5);
      bar(5);  
    }
    

    Ist dir klar, warum der Aufruf von bar geht, der von foo nicht? Dein Fall ist identisch, bloß dass der Aufruf von Vektor::Vektor(Vektor&) ein bisschen versteckt ist.


Log in to reply