friend-Funktion und Operatorüberladung
-
Hallo Leute,
ich versuch gerade folgende Aufgabe zu lösen:
Entwickeln Sie die Klasse Arr, die ein Feld mit zwei int-Werten enthält. Überladen Sie den +Operator so, dass die Addition zweier Arr-Objekte, die Addition eines Arr-Objekts mit einer Konstanten und die Addition einer Konstanten mit einem Arr-Objekt möglich wird. Verwenden Sie für die Überladung ausschließlich friend-Funktionen und keine Methoden der Klasse Arr. Weitere Methoden der Klasse Arr sind im Teil a) nicht verlangt.
(Bei einer Addition zweier Objekte sollen die jeweiligen Feldelemente addiert werden. Ist eine Konstante beteiligt, wird diese Konstante zu jedem der beiden Feldelemente addiert.)Also soweit kein Problem...
So sieht meine momentane Lösung aus:#ifndef Uebungsblock_3_Aufgabe_2_Arr_h #define Uebungsblock_3_Aufgabe_2_Arr_h class Arr { int number[2]; public: Arr(int x, int y); void print(); void operator+(const Arr& a); void operator+(int i); }; #endif#include <iostream> #include "Arr.h" Arr::Arr(int x, int y){ number[0] = x; number[1] = y; } void Arr::print() { std::cout << "number[0] = " << number[0] << std::endl; std::cout << "number[1] = " << number[1] << std::endl; } void Arr::operator+(const Arr& a) { number[0] += a.number[0]; number[1] += a.number[1]; } void Arr::operator+(int i) { number[0] += i; number[1] += i; }So funktioniert das auch...
Es gibt aber drei Sachen die ich aber nicht ganz verstehe...1 und 2.
Wieso soll ich die ausschließlich friend-Funktionen nutzen?
Es funktioniert ja auch ohne...
Ich weiß da die obere Funktion auf private-Attribute zugreift sollte ich das machen aber es funktioniert ja auch so und sobald ich eine friend-Funktion daraus mache meckert der Compiler...Ich hab folgendes gemacht:
#ifndef Uebungsblock_3_Aufgabe_2_Arr_h #define Uebungsblock_3_Aufgabe_2_Arr_h class Arr { int number[2]; public: Arr(int x, int y); void print(); friend void operator+(const Arr& a); void operator+(int i); }; #endif#include <iostream> #include "Arr.h" Arr::Arr(int x, int y){ number[0] = x; number[1] = y; } void Arr::print() { std::cout << "number[0] = " << number[0] << std::endl; std::cout << "number[1] = " << number[1] << std::endl; } friend void Arr::operator+(const Arr& a) { number[0] += a.number[0]; number[1] += a.number[1]; } void Arr::operator+(int i) { number[0] += i; number[1] += i; }Dann sagt er mir aber in der Implementierungs-Datei in Zeile 14 "Out-of-line definition of 'operator+' does not match any declaration in 'Arr'"...
Auch wenn ich das "friedn" in der Implementierung vorne weg lasse kommt das gleiche... Was mache ich falsch?Wie soll ich bitte eine Konstande mit einem Arr-Objekt addieren?
Das müsste ja in etwa so ausschauen:Arr a(1,2); int sol = 5 + a;Damit das geht müsste ich doch den +Operator von int oder so überladen oder gibt es da eine andere Möglichkeit?
-
Hallo vandread.
zu 1 und 2:
es gibt keinen friend operator+(//...). Du kannst operator+ als Methode oder freie Funktion überladen(du hast ersteres). Muss auch ehrlich sagen ich verstehh die Aufgabenstellung nicht zu 100%. Wo hast du die her?zu 3.
Eine Regel besagt, dass mindestens ein Argument ein benutzerdefinierter Datentyp sein muss.
du kannst schreiben: Arr operator+(const Arr& lhs, const Arr& rhs), oder
Arr operator(const Arr& lhs, const int& rhs), oder Arr operator+(const int lhs, const Arr& rhs).gruß
syntax
-
@vandread: Die friend Funktion ist nur eine freie Funktion, die Tatsache dass ihre Definition in der Klasse stehen kann ändert daran nix.
Dein friend operator + wird daher also natürlich zwei Parameter benötigen und nicht nur einen.
Abgesehen davon wird es wohl sinnvoll sein, deinen Operatoren einen anderen Rückgabetyp als void zu verpassen.
Wenn du einen operator + als Methode implementierst, wird es sich in der Regel anbieten, diese const zu machen.
Du verwendest += in deiner Implementierung von +. Bist du dir sicher dass das eine gute Idee ist?
Ich seh in dem konkreten Beispiel aber auch keinen unmittelbaren Grund, die Operatoren ausschließlich als friends zu implementieren. Aber wenn die Aufgabenstellung das explizit verlangt, dann solltest du das wohl so machen...
Syntax_error schrieb:
zu 1 und 2:
es gibt keinen friend operator+(//...). Du kannst operator+ als Methode oder freie Funktion überladen(du hast ersteres).Und was denkst du ist eine friend Funktion, wenn es nicht eine freie Funktion ist?

-
dot schrieb:
Und was denkst du ist eine friend Funktion, wenn es nicht eine freie Funktion ist?

Eine Methode, Memberfunktion. friend Funktion wär mir komplett neu, aber ich lasse mich auch eines besseren belehren, wenn dies auch eine friend-Funktion sein sollte

gruß
syntax
-
Syntax_error schrieb:
Eine Methode, Memberfunktion. friend Funktion wär mir komplett neu, aber ich lasse mich auch eines besseren belehren, wenn dies auch eine friend-Funktion sein sollte

Was genau wäre der Sinn davon, eine Methode zu einem friend zu machen?

-
oje jetzt verwirrst du mich??

was ist jetzt eine friend-Funktion??gruß
syntax
-
Syntax_error schrieb:
was ist jetzt eine friend-Funktion??
Vermutlich ist damit eine Funktion gemeint, die als friend deiner Klasse deklariert wurde. Was das bedeutet findest du hoffentlich irgendwo im C++ Lehrbuch deiner Wahl...