PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++: Überladen von Operatoren



ContainerDriver
02-07-2008, 22:12
Hallo,

zur Klausurvorbereitung in C++ wollte ich eine Klasse Bruch implementieren, deren Operatoren überladen sind. Hier mal mein bisheriger Code:


#include <iostream>

using namespace std;

class Bruch
{
private:
int z;
int n;
public:
Bruch();
Bruch(int _z, int _n);
Bruch(Bruch& b)
{
cout << "Hi, I'm the Copy-Constructor!" << endl;
}

friend ostream &operator<<(ostream &_o, Bruch &_b);
Bruch operator+(Bruch &_b);
Bruch &operator=(Bruch &_b);
};

Bruch::Bruch()
{
z=0;
n=0;
}

Bruch::Bruch(int _z, int _n)
{
z=_z;
n=_n;
}

Bruch &Bruch::operator=(Bruch &_b) //!
{
cout << "Zuweisung!" << endl;

return *this;
}

ostream &operator<<(ostream &_o, Bruch &_b)
{
_o << _b.z << "/" << _b.n;

return _o;
}

Bruch Bruch::operator+(Bruch &_b)
{
Bruch tmp(z,n);
tmp.z = tmp.z*_b.n + _b.z*tmp.n;
tmp.n *= _b.n;

return tmp;
}

int main(void)
{
Bruch b1(2,1),b2(4,1);
Bruch b3;
Bruch b4;

b4=b1;

b3 = b1 + b2; //!!

cout << b1 << " " << b2 << endl;

cout << b3 << endl;
}


Leider bricht der Compiler (g++ (GCC) 4.3.1) mit folgender Meldung ab:


bruch.cpp: In function 'int main()':
bruch.cpp:(siehe !!): error: no match for 'operator=' in 'b3 = b1.Bruch::operator+(((Bruch&)(& b2)))'
bruch.cpp:(siehe !): note: candidates are: Bruch& Bruch::operator=(Bruch&)

. Wo ist denn da das Problem? Kann vom Rückgabewert des +-Operators nicht automatisch eine Referenz gebildet werden?

Wenn ich den Operatoren statt einer Referenz ein Objekt übergebe (also wenn ich z.B. schreibe Bruch operator+(Bruch _b)), dann funktioniert der Code, allerdings wird dann ja auch bei jedem Aufruf eines Operators der Kopierkonstruktur aufgerufen (weil eine Kopie des übergebenen Objektes angelegt wird). Das wollte ich verhindern. Wie ist das möglich (eigentlich ja mit Referenzen, dann beschwert sich aber der Compiler...)?


Gruß, Florian

EDIT: habe gerade mal umgebootet und in Visual Studio 2008 lässt sich der Code ohne Probleme übersetzen... der Code würde sich nämlich auch mit meinen Unterlagen decken.

ContainerDriver
03-07-2008, 15:22
Wenn man den Übergabeparameter für operator= konstant macht, dann haut es hin mit dem Kompilieren:


Bruch &Bruch::operator=(Bruch const &_b);


Stellt sich nur die Frage, warum man das machen muss...

Gruß, Florian

peschmae
03-07-2008, 16:14
Sinnvoll ist es ja schon, das Argument const zu machen.

Aber wieso der GCC das verlangt verstehe ich auch nicht. Habe gerade keinen C++ Standard rumliegen, aber sogar Stroustroup gibt Beispiele mit =-Operatoren ohne const Argument...

MfG Peschmä

ContainerDriver
03-07-2008, 16:25
Hab das auch schon mit der älten Version 2.95 vom g++ probiert, da klappt das Übersetzen noch; der Borland C++-Compiler (wird in unserer Vorlesung verwendet und ist auch schon sehr alt) kompiliert den Code allerdings nicht.