2010-02-28 10 views
5

Tamam, bir kitap üzerinde çalışıyorum ve C++ operatör aşırı yüklemesini öğrenmeye çalışıyorum. Kurucu için tek bir int (başlangıçta 0'a ayarlı) alan bir BigInt sınıfı oluşturdum. I + = yöntemi aşırı ve aşağıdaki kodda sadece iyi çalışır:C++ 'da Overloading Operator +

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

kod çıktısı 4. Yani, o zaman aşağıdaki kodu küresel operatörü aşırı + kullanarak üzerinde çalışıyordu:

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

Bu aynı zamanda şu kodu çalışıyor: aşağıdaki kodu çalıştırmak çalıştığınızda bu, ancak 6. yazdırır

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

, sadece işe yaramaz. Kitap çok iyi açıklamıyor ve sadece çalışması gerektiğini ima ediyor.

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

Bu z 1 neden online ve stackoverflow googled 6. olmalı ama tam olarak böyle bir sorunum olduğunu kimseye bulamayınca emin değilim 1. yazdırır. bazıları yakındı, ama cevaplar uymadı. Herhangi bir yardım çok takdir edilir!

+4

Bunun senin probleminle ilgili olduğunu sanmıyorum, fakat verimlilik için (ve ayrıca C++ 'da idiomatik olduğu için)' operatör + 'argümanları, const değerine göre değil, const değerine göre alınmalıdır. 'BigInt operatör + (const BigInt & lhs, const BigInt & rhs)' –

+3

Bir şey merak ediyorum: Neden sadece '= 1' yerine' = BigInt (1) 'yazıyorsunuz? Tam sınıf tanımınızı gösterdiyseniz, size daha iyi yardımcı olabiliriz diye düşünüyorum :) –

+1

Tyler ile aynı fikirdeyim. Ayrıca, 'BigInt x (1)' olarak başlatılması daha idiyomiktir, 'Yaptığınız yol geçici bir durum oluşturur ve daha sonra kopya ctor'unu çağırır (bu muhtemelen en iyi duruma getirilmiş olsa da). – Dan

cevap

3

büyük olasılıkla sorun += numaralı işleçte bulunmaktadır. Bunun için posta kodu.

+0

Eh, @Johannes Schaub, dolaylı döküm yoluyla dönüştürüldüğünü söylediğinde haklıydı (çok fazla kesme noktası ve kod takibi, benim için bir tane çıkardı). Sorun aslında + = operatöründeydi. Bunu daha önceki yorum ve @aaa'nın yardımıyla çözemedim. İkinize de teşekkürler! –

2

BigInt'e int eklemek için aşırı yüklenmeye ihtiyacınız var; Örneğindeki sabit 5, int türünde, BigInt değil. Böyle bir şey çalışması gerekir: Sen de operator+(const int lhs, const BigInt rhs) tane isteyebilirsiniz

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

.

+4

Derlenmiş kodun, "BigInt" 'e dönüştürmenin (örtük dönüştürme yoluyla) çalıştığını ima etmesi. Kod neden '1' derlenmeli ve yazdırılmalı? Bu bana mantıklı gelmiyor. –

+0

Evet, "int" olan bir "nonlicit" yapıcısı olmadıkça, yani "int" ile "BigInt" arasında dönüşüm sağladığından, operatör + 'ın üç aşırı yüklenmesine gereksiniminiz vardır. kevingessner, 'const' 'int' önce parametre listesinde işe yaramıyor. Öte yandan, dönüş tipi muhtemelen "a + b = c;" gibi saçmalıklardan kaçınmak için 'BigInt' olmalıdır. –

+0

Çözümün üzerinde çalıştım ve hala aynı cevabı aldım. –

0

Gönderdiğiniz kod düzgün görünüyor ve çalışmalı. Gördüğünüz sorunlar neredeyse kesinlikle BigInt sınıfınızın kopya kurucusu veya görev operatörü nedeniyle.

1

süper basitleştirilmiş kod (Ben geçerli tek başına çalıştırılabilir programa tüm kod eklemek için eklemek ve yapabilir asgari) Aşağıdaki:

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

yayar, öngörülebilir olarak:

BigInt(6) 
BigInt(6) 

Lütfen gözlemlediğiniz hatayı yeniden üretmek için bu çalışma kodunda mümkün olan en az değişiklik yapın - ki bu da hatanın tam olarak nerede bulunduğunu gösterecektir.