2010-02-28 15 views
5

Ok, ich arbeite in einem Buch und versuche, C++ Operatorüberladung zu lernen. Ich habe eine BigInt-Klasse erstellt, die für den Konstruktor ein einzelnes int (anfänglich auf 0 gesetzt) ​​verwendet. Ich überlastete die + = Methode und es funktioniert im folgenden Code ganz gut:Overloading Operator + in C++

BigInt x = BigInt(2); 
x += x; 
x.print(cout); 

Der Code wird ausgegeben 4. Also, dann arbeite ich die globalen Betreiber Überlastung + mit dem folgenden Code:

BigInt operator+(const BigInt lhs, const BigInt rhs) 
{ 
    BigInt returnValue(lhs); 
    returnValue += rhs; 
    return returnValue; 
} 

Dies funktioniert auch gut für den folgenden Code:

BigInt x = BigInt(1); 
BigInt y = BigInt(5); 
BigInt z = x + y; 
z.print(); 

Diese 6. Allerdings druckt, wenn ich versuche, den folgenden Code auszuführen, es funktioniert einfach nicht. Das Buch erklärt nicht sehr gut und impliziert, dass es einfach funktionieren sollte.

BigInt x = BigInt(1); 
BigInt z = x + 5; 
z.print(); 

Dieser druckt 1. Ich bin nicht sicher, warum z 1 ist, wenn es 6. Ich online und auf Stackoverflow gegoogelt sein soll, aber ich konnte nicht jemand anderes finden, die ein Problem genau so mit wurde. einige waren nah dran, aber die Antworten passten einfach nicht. Jede Hilfe wird sehr geschätzt!

+4

I don‘t denke, das für Ihr Problem bezieht, sondern aus Gründen der Effizienz (und auch, weil es idiomatische ist in C++) sollte die Argumente' Operator + 'durch konstante Referenz genommen werden, nicht von Wert, z.B. 'BigInt-Operator + (const BigInt & lhs, const BigInt & rhs)' –

+3

Eine Sache, über die ich mich wundere: Warum schreibst du '= BigInt (1)' anstatt nur '= 1'? Ich denke, wenn du uns deine komplette Klassendefinition gezeigt hast, können wir dir besser helfen :) –

+1

Ich stimme Tyler zu. Auch idiomatisch zu initialisieren als 'BigInt x (1);' Die Art, wie Sie es tun, erstellt eine temporäre und ruft dann die Kopie ctor (obwohl das wahrscheinlich optimiert werden würde). – Dan

Antwort

3

wahrscheinlichste Problem ist in += Operator. Postleitzahl dafür.

+0

Nun, @Johannes Schaub hatte Recht, als er sagte, dass es durch implizites Casting konvertiert wurde (eine Menge Breakpoints und Code-Tracing fanden das für mich heraus). Das Problem lag tatsächlich im Operator + =. Ich hätte das ohne die Hilfe eines früheren Kommentars und @aaa nicht herausfinden können. Danke Beide! –

2

Sie benötigen eine Überlastung für einen int zu BigInt hinzuzufügen; Die Konstante 5 in Ihrem Beispiel ist vom Typ int, nicht BigInt. So etwas sollte funktionieren:

BigInt operator+(const BigInt lhs, const int rhs) 
{ 
    BigInt returnValue(rhs); 
    returnValue += lhs; 
    return returnValue; 
} 

Sie ein auch für operator+(const int lhs, const BigInt rhs) wollen könnte.

+4

Der kompilierte Code impliziert, dass die Konvertierung in BigInt funktioniert (implizite Konvertierung). Warum sollte der Code "1" kompilieren und drucken? Das ergibt für mich keinen Sinn. –

+0

Ja, es sei denn, es gibt einen nicht-expliziten Konstruktor, der 'int' übernimmt, d. H. Für die Umwandlung von' int' nach 'BigInt' sorgt, benötigen Sie drei Überladungen von' operator + '. @kevingessner, 'const' vor' int' ist irgendwie nutzlos in der Parameterliste. Auf der anderen Seite sollte der Rückgabetyp wahrscheinlich "const BigInt" sein, um Unsinn wie 'a + b = c;' zu vermeiden. –

+0

Ich habe versucht, über Lösung, und ich habe immer noch die gleiche Antwort. –

0

Der Code, den Sie geschrieben haben sieht gut aus und funktionieren sollte. Probleme, die Sie sehen, sind mit ziemlicher Sicherheit auf den Kopierkonstruktor oder den Zuweisungsoperator Ihrer BigInt-Klasse zurückzuführen.

1

Die folgenden Super vereinfachten Code (das Minimum ich hinzufügen kann alle Ihre Codes enthalten und es in ein gültiges eigenständigen ausführbares Programm machen):

#include <iostream> 

class BigInt 
{ 
    public: 
    BigInt(int i): _i(i) {} 
    void print() { std::cout << "BigInt(" << _i << ")\n"; } 
    void operator +=(const BigInt rhs) { _i += rhs._i; } 
    private: 
    int _i; 
}; 

BigInt operator+(const BigInt lhs, const BigInt rhs) 
{ 
    BigInt returnValue(lhs); 
    returnValue += rhs; 
    return returnValue; 
} 

int main() { 
    BigInt x = BigInt(1); 
    BigInt y = BigInt(5); 
    BigInt z = x + y; 
    z.print(); 

    BigInt ax = BigInt(1); 
    BigInt az = ax + 5; 
    az.print(); 

    return 0; 
} 

aussendet, wie vorhersehbar:

BigInt(6) 
BigInt(6) 

Bitte beachten Sie die minimal mögliche Änderungen an diesem Arbeits Code machen den Fehler zu reproduzieren Sie beobachten - das wird natürlich zeigen, wo Ihre Fehler genau liegt.