2016-03-20 19 views
-4

Sınıf bigInt için "+" yüklemeyi deniyorum (uzun bir int kaydetmek için bağlantıyı kullanın). Aşağıda gösterildiği gibi x1, x2 toplamını döndürün. Neden nesneyi iade edemiyorum?

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; 
    } 

Ama ana işlevi

, toplamı hiçbir şey gibi görünüyor, ieit sadece cout a + b = ana işlevi (not hiç çıkış toplamı çıkış şey yok olduğu): Ben

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"); 
} 

aşırı "< <" ve ">>" zaten. Ama neyin yanlış olduğunu anlamıyorum. Herhangi bir yardımı takdir edeceğim.


Öneriler için teşekkürler. Ben aşırı yük "=" şimdi. Ve hatayı works.But "= b toplamı" Yukarıdaki yanlış olabilir ne olduğunu tahmin çalışılıyor

 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

sana" ne demek istiyorsunuz ihtiyacı toplamı ana fonksiyona alamaz ". Derleyici hatası, çalışma zamanı hatası? Ne oluyor? – jpo38

+0

Zayıf ifadem için üzgünüm ve sorumu değiştirdim. Aslında, hata, toplamın ana işlevde "cout" olamamasıdır. – Louise

+0

Görev operatörünüzde es1’in bulunması ne demektir?Nesnelerinizde neler olduğunu görmek için bir hata ayıklayıcı kullanmak isteyebilirsiniz. – jpo38

cevap

0

:(kalacak gibi görünüyor. Eğer bigInt sınıf koduna erişim verdiyse kolay olmaz.

sum=b+a; olacak atama işlecini kullanın (operator=) Görünüşe göre (yüklediğiniz ve söylediğiniz), aşırı yüklemediniz.Bu yüzden derleyici varsayılan uygulama kopyalama nesnesi özniteliğini kullanacaktır (bigInt sınıfınız işaretçiler kullanıyorsa ve bigInt ile bitebilirse sonuç boş ... ama bigInt sınıf kodunu göndermediğinden emin olmak zor.

Ya aşırı yük operator= (iyi ve en iyi çözüm, see this), ya da aşağıda önerilen olarak kullanmaktan kaçının (eğer derleyici yeterince akıllı ise haricinde bir return value optimization gerçekleştirerek kullanmak değil, bir copy constructor gerekebilir) olmalıdır:

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"); 
} 

Bu tür sorunlardan kaçınmak için kendi kopya oluşturucunuzu ve görev operatörünüzü tanımlamanın iyi bir uygulama olduğunu unutmayın. See this. Tüm sınıf öznitelikleri kopyalanabiliyorsa bunları bildirmemeye gerek yok, eğer onlar (işlenmemiş işaretçiler gibi) değilse tamam değildir.

+1

Yorum yapmadan indirme yasaklanmalıdır .... – jpo38

+1

"HER ZAMAN kendi kopya kurucunuzu ve görev operatörünüzü tanımlamanız için iyi bir uygulama olduğunu unutmayın", bunu yapmak zorunda kalmamanız gerektiğini söyleyebilirim. Ayrıca, yanıtlamak için yayında yeterli bilgi yok. Ve geçersiz ana(). – juanchopanza

+1

HER ZAMAN kendi kopya kurucunuzu ve görev operatörünüzü tanımlamanız gerektiğini kabul etmiyorum. IMO tam tersi doğrudur. –

-1

Kopya oluşturucu ve atama işlecini de aşırı yüklediğinizden emin olun.

Eğer sum=a+b gerçekleştirdiğinizde atama aşırı olmadan toplamı (sol taraf)

içine geçici toplamı nesne (sağ taraf) içeriğini kopyalamak gerekir atama operatörü, derleyici çoğaltan bir "sığ kopya", gerçekleştirecek sınıfının her bir üyesi. Sınıfta bulunan tüm işaretçiler kopyalanacak, ancak temel veriler taşınmayacak.

Bu, ana toplam değişkeninizin işlev kopyanızın verisini göstereceği anlamına gelir. Ancak, bu toplam nesne geçici ve görevinden sonra silinir, ana toplamınız eksik kalır.

Sizin aşırı atama operatörü sol tarafta Bigint içine sağ tarafında bağlantılı listeden değerleri okuyarak bir BigInt yaratır bir "derin kopya" yapmak

+0

Sorun olduğunu nereden biliyorsunuz? OP'in koduna erişiminiz var mı? – juanchopanza

+0

OP, ekleme işlecindeki toplam nesnenin doğru olduğunu ve geri göndermeden önce yazdırıldığını, ancak atanan sürümün çalışmadığını gösterir. Görev operatörünün doğru şekilde aşırı yüklenmediğini kolayca anlayabilirim –

İlgili konular