C++ friend-Funktion und Operatorüberladung

vandread

Lt. Commander
Registriert
Nov. 2004
Beiträge
1.380
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:

Code:
#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

Code:
#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;
}

Das funktioniert auch wunderbar...
Das einzige was ich jetzt nicht verstehe ist...
Wie soll ich bitte eine Konstande mit einem Arr-Objekt addieren?
Das müsste ja in etwa so ausschauen:

Code:
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?

Was ich auch nicht verstehe ist, wieso ich "ausschließlich" friend-Funktionen nutzen soll,
das ist doch in diesem Fall total überflüssig da ich ja in ein und der selben Instanz bin...
 
Deine Aufgabenstellung sagt explizit aus, daß für die Bereitstellung der Operatoren keine Methoden, sondern Friendfunktionen zu verwenden sind, und doch hast du die Operatoren als Member der Klasse definiert (und dann auch noch falsch). ;)

Die Operatoren müssen als freie Funktionen definiert werden. Damit sie aber auf die Innereien der Klasse zugreifen können, mußt du sie zu friends der Klasse machen. Mach das erst mal ... dann wirst du vielleicht auch schon von selbst auf die Lösung deines 2. Problems kommen.
Ergänzung ()

Nachtrag: Da ich bereits erwähnte, daß dein Operator + falsch definiert ist, hier ist die gängige, korrekte Signatur für Operator + (in diesem Beispiel nur für 2 Operanden des selben Typs):

Code:
MyClass operator + ( const MyClass& lhs, const MyClass& rhs );
 
Zuletzt bearbeitet:
Vielen Dank für den Tipp!

Aber ich verstehe nicht so ganz was du mit "freie Funktionen" meinst...
Ich muss die doch in der Klasse definieren, wo soll ich das sonst machen, oder verstehe ich da was falsch?
 
Informier dich halt mal ein wenig zum Thema Operator-Überladen in C++.
Neben der Möglichkeit, den Operator über eine Methode in einer Klasse zu erweitern, gibt es auch die Möglichkeit, globale Funktionen, die nicht in irgendeiner Klasse definiert sind, zu nutzen.

Warum braucht man letzteres? Es gibt genug fertige Klassen, die du nicht mal eben erweitern kannst, weil du einfach den Quelllcode nicht hast. Z.B. kannst du für den Outputstream (Stichwort cout) den Operator << überladen, dass er MyClass ausgeben kann. Dann viel Spaß beim Ändern der C++-STL... mit der globalen Funktion ist das kein Problem.


Mehr hilfe solltest du für deine Aufgaben hier auch nicht erwarten. Frag andere, die die selbe Aufgabe bekommen haben, frag notfalls den Aufgabensteller, oder versuch deine Unterlagen durchzuwälzen. Ich glaube niemand bekommt Aufgaben ohne Unterlagen...
 
Zuletzt bearbeitet:
Zurück
Oben