2016-03-28 126 views
0

我正在學習C++,我試圖做一些多態性和運算符重載,我有一些問題。抽象類重載算術運算符

我在做什麼這裏是被叫號碼,並呼籲敏,我需要重載運算符+,一類衍生化的抽象基類 - 爲了與MyInt號碼,MyDouble數字操作...等

後閱讀很多帖子我被困在這個錯誤error: invalid operands of types 'Number*' and 'Number*' to binary 'operator+' cout << n + m << endl;我該如何做這項工作?

我知道這個工程使用的模板,但我不能在這裏使用它,因爲本練習的一點是要創造這樣MyStack<Number*>持有不同的數據類型

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

回答

-1

你們這樣做是非常錯誤的。直接的錯誤來源是您的nm都是指針,但成員operator+會希望調用對象。

你可以在理論上,執行雙重分派(否則語法將只是醜):

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

然而,雖然加上就會被調用lhs將被稱爲無形中,rhs仍將是一個抽象類型。除非你爲它做了dynamic_cast,否則你將無法弄清楚它是什麼 - 這真是太難看了。一般來說,你的例子不是動態多態的好例子。

+0

當我把2個參數拋出下一個錯誤'數字* MyInt ::運算符+(數字*,數字*)'必須採取零或一個參數 數字*運算符+(數字* n,數字*米) – Frank

+0

對不起對於醜陋的代碼,我是新來的C++,我會看看有關dynamic_cast的信息。感謝您的答覆 – Frank