2016-03-20 24 views
-4

Ich versuche, "+" für die Klasse bigInt zu überladen (verwenden Sie Linkedlist, um einen langen int zu speichern) .Ich gebe die Summe von x1, x2 in der Funktion zurück, wie unten gezeigt.Warum kann ich mein Objekt nicht zurückgeben?

friend bigInt operator+(bigInt &x1,bigInt &x2){ 
     bigInt sum; 
     int lenx1=x1.length(); 
     int lenx2=x2.length(); 
     int len_sum; 
     len_sum=lenx1>lenx2?lenx1:lenx2; 
     if(len_sum==lenx1){ 
      for(int i=len_sum-1;i>=lenx2;--i){ 
       sum.insert(0,x1.visit(i)->data); 
      } 
      for(int i=lenx2-1;i>=0;--i){ 
       int add=x1.visit(i)->data+x2.visit(i)->data; 
       if(add>9){ 
        sum.visit(i+1)->data+=1; 
        add-=10; 
       } 
       sum.insert(0,add); 
      } 
     } 
     else{ 
      for(int i=len_sum-1;i>=lenx1;--i){ 
       sum.insert(0,x2.visit(i)->data); 
      } 
      for(int i=lenx1-1;i>=0;--i){ 
       int add=x1.visit(i)->data+x2.visit(i)->data; 
       if(add>9){ 
        sum.visit(i+1)->data+=1; 
        add-=10; 
       } 
       sum.insert(0,add); 
      } 
     } 
     cout<<"sum="<<sum<<endl;//output is right here. 
     return sum; 
    } 

Aber in Hauptfunktion Summe nichts zu sein scheint, ieit cout nur a + b = (wo Ruf auch alle Ausgangssummenausgang nichts) Hauptfunktion:

void main(){ 
    bigInt a,b,sum; 
    cout<<"please input a big int a:"<<endl; 
    cin>>a; 
    cout<<"please input a big int b:"<<endl; 
    cin>>b; 
    sum=b+a; 
    cout<<a<<"+"<<b<<"="<<sum<<endl; 
    system("PAUSE"); 
} 

Ich habe Überlastung "< <" und ">>" schon. Aber ich verstehe nicht, was hier falsch ist. Ich werde jede Hilfe zu schätzen wissen.


Danke für die Vorschläge.I Überladung "=" jetzt. Und „sum = b“ works.But die Fehler oben scheint :(

 bigInt &operator=(bigInt &right) 
{ 
    if(this==&right) return *this; 
    clear(); 
    bigInt resl; 
    int len=right.length(); 
    for(int i=0;i<len;++i) 
    { 
     insert(i,right.visit(i)->data); 
    } 
    return *this; 
} 
+1

Was meinst du mit „I kann die Summe in der Hauptfunktion nicht bekommen ". Compilerfehler, Laufzeitfehler? Was geschieht? – jpo38

+0

Sorry für meinen schlechten Ausdruck und ich habe meine Frage ändern. Eigentlich ist der Fehler, dass die Summe in der Hauptfunktion nicht "cout". – Louise

+0

Was ist es1, dass es in Ihrem Zuweisungsoperator sein soll?Vielleicht möchten Sie einen Debugger verwenden, um zu sehen, was in Ihren Objekten enthalten ist. – jpo38

Antwort

0

versuchen zu erraten, zu bleiben, was falsch sein könnte. Wäre einfacher, wenn Sie den Zugriff auf bigInt Klassencode geben.

sum=b+a; werden Verwenden Sie den Zuweisungsoperator (operator=) Anscheinend (von dem, was Sie gepostet und gesagt), haben Sie ihn nicht überladen.Der Compiler wird Standard-Kopierobjekte Attribut verwenden (das kann unsicher sein, wenn Ihre bigInt Klasse Zeiger verwendet und am Ende mit bigInt enden kann) Ergebnis ist leer ... aber es ist schwer, sicher zu sein, weil Sie bigInt Klassencode nicht gepostet haben.)

Sie sollten entweder Überlastung operator= (gute und beste Lösung, see this) oder vermeiden Sie es, wie unten vorgeschlagen (Sie können eine copy constructor benötigen, es sei denn, Compiler ist intelligent genug, um es nicht zu benutzen, indem Sie eine return value optimization Durchführung):

int main(){ 
    bigInt a,b; 
    cout<<"please input a big int a:"<<endl; 
    cin>>a; 
    cout<<"please input a big int b:"<<endl; 
    cin>>b; 
    bigInt sum(b+a); // assignment operator is not used anymore 
    cout<<a<<"+"<<b<<"="<<sum<<endl; 
    system("PAUSE"); 
} 

Beachten Sie, dass es eine gute Übung ist, einen eigenen Kopierkonstruktor und Zuweisungsoperator zu definieren, um diese Art von Problem zu vermeiden. See this. Es ist in Ordnung, sie nicht zu deklarieren, wenn alle Klassenattribute kopierbar sind, es ist nicht OK, wenn sie nicht (wie rohe Zeiger) sind.

+1

Downoting ohne Kommentar sollte verboten sein .... – jpo38

+1

"Beachten Sie, dass es eine gute Übung ist, IMMER einen eigenen Kopierkonstruktor und Zuweisungsoperator zu definieren", würde ich sagen, dass Sie das fast nie tun sollten. Auch gibt es nicht genug Informationen in der Post zu beantworten. Und 'void main()'. – juanchopanza

+1

Ich stimme nicht zu, dass Sie IMMER Ihren eigenen Kopierkonstruktor und Zuweisungsoperator definieren sollten. IMO das Gegenteil ist der Fall. –

-1

Achten Sie darauf, den Kopierkonstruktor und den Zuweisungsoperator ebenfalls zu überladen.

Wenn Sie sum=a+b der Zuweisungsoperator ausführen soll, den Inhalt des temporären Summe Objekt (rechte Seite) in Summe (linke Seite)

ohne Überlastung Zuordnung kopieren, wird der Compiler eine „flache Kopie“, führen die Duplikate jedes Mitglied deiner Klasse. Alle Zeiger, die Sie in der Klasse haben, werden kopiert, aber die zugrunde liegenden Daten werden nicht verschoben.

Dies bedeutet, dass Ihre Hauptsummenvariable auf die Daten Ihrer Funktionskopie zeigt. Dieses Summenobjekt ist jedoch temporär und wird nach der Zuweisung gelöscht, sodass Ihre Hauptsumme nicht vollständig ist.

Ihre überladenen Zuweisungsoperator braucht eine „tiefe Kopie“ zu tun, die durch das Lesen der Werte aus der verknüpften Liste auf der rechten Seite in die BigInt auf der linken Seite eine BigInt erschafft

+0

Woher wissen Sie, dass das Problem ist? Haben Sie Zugriff auf den OP-Code? – juanchopanza

+0

Das OP zeigt an, dass das Summenobjekt im Additionsoperator korrekt ist und druckt, bevor es zurückgegeben wird, aber dass die zugewiesene Version nicht funktioniert. Ich kann leicht schließen, dass der Zuweisungsoperator nicht korrekt überladen ist –

Verwandte Themen