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 '.' tokenVektor.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ürdeDas ist die Lösung! Das mit const muss ich mir noch genauer angucken.
Vielen Dank an alle!!
-
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.