Anzeige:
Ergebnis 1 bis 4 von 4

Thema: C++: Überladen von Operatoren

  1. #1
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418

    C++: Überladen von Operatoren

    Hallo,

    zur Klausurvorbereitung in C++ wollte ich eine Klasse Bruch implementieren, deren Operatoren überladen sind. Hier mal mein bisheriger Code:
    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:
    Code:
    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.
    Geändert von ContainerDriver (02-07-2008 um 22:29 Uhr)
    Ein gebrechlich Wesen ist der X-Server.

  2. #2
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Wenn man den Übergabeparameter für operator= konstant macht, dann haut es hin mit dem Kompilieren:
    Code:
    Bruch &Bruch::operator=(Bruch const &_b);
    Stellt sich nur die Frage, warum man das machen muss...

    Gruß, Florian
    Ein gebrechlich Wesen ist der X-Server.

  3. #3
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  4. #4
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    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.
    Ein gebrechlich Wesen ist der X-Server.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •