2016-03-28 38 views
0

Ben C++ öğreniyorum ve bazı polimorfizm ve operatör aşırı yüklemeye çalışıyorum ve bazı sorunlar yaşıyorum.Özet sınıf aritmetik operatörü aşırı yükleme

Ne burada ne işim olduğunu Sayısı ve ben, operatör + aşırı gerekir MyInt adlı bir türevi, sınıf denilen soyut temel sınıfı - MyInt numaraları, MyDouble numaraları ile çalışabilmesi için ... vb

sonra Bu hataya takıldığım birçok gönderiyi okumak error: invalid operands of types 'Number*' and 'Number*' to binary 'operator+' cout << n + m << endl; Bu işi nasıl yapabilirim?

bu şablonları kullanarak çalıştığını biliyorum ama bu excercise noktası MyStack<Number*> gibi bir şey yaratmaktır çünkü sen çok yanlış yaptı farklı veri türleri

#include <cstdlib> 
#include <iostream> 
#include <string> 
#include <sstream> 
using namespace std; 

class Number { 
public: 
    virtual Number* operator+(Number* n) = 0; 
    virtual string toString() = 0; 
    friend ostream& operator<<(ostream& os, Number* n){ 
     return os << n->toString(); 
    } 
}; 

class MyInt: public Number{ 
public: 
    int value; 
    MyInt(int e){ 
     value = e; 
    } 
    virtual ~MyInt(){} 
    int getNum(){ return value;} 

    Number* operator+(Number* n){ 
     MyInt* a = (MyInt*) n;   
     return new MyInt(value + a->value); 
    } 

    string toString(){ 
     ostringstream oss; 
     oss << value; 
     return oss.str(); 
    } 
}; 

int main(int argc, char** argv) { 
    Number* n = new MyInt(5); 
    Number* m = new MyInt(3); 

    cout << "N: " << n << endl; 
    cout << "M: " << m << endl; 


    cout << n + m << endl; 

    return 0; 
} 

cevap

-1

tutmak için buradan kullanamaz. Hemen hata kaynağı, n ve m öğelerinizin işaretçilerdir ve yine de üye operator+, bir nesnenin çağrılmasını ister.

Sen, teorik olarak, bir çift gönderim gerçekleştirebilir (Aksi sözdizimi sadece çirkin olurdu): artı lhs için adı verilecek ise

// define operator+ as a free function 
Number* operator+(Number* lhs, Number* rhs) { 
    return lhs->operator+(rhs); 
} 

Ancak adı verilecek neredeyse, rhs soyut kalacak yazın. Bunun için dynamic_cast yapmazsanız ne olduğunu anlamayacaksınız - ve bu sadece çirkin. Genel olarak, örneğiniz dinamik polimorfizm için iyi bir durum değildir.

+0

2 argüman koyduğumda bir sonraki hata atar 'Number * MyInt :: operator + (Sayı *, Sayı *)' sıfır veya bir argüman almalıdır Number * operator + (Number * n, Number * m) – Frank

+0

Üzgünüz çirkin kod için, ben C++ için yeni, dynamic_cast hakkında bilgi bakacağız. cevabınız için teşekkürler – Frank