2015-01-15 97 views
-1

因此,我已寫了一些代碼實現此層次結構:操作+/-重載如在C++中的非成員函數

class A 
{ 
    int x; 
    int y; 
public: 
    A() { } 
    void setX(int x) { this->x = x;} 
    void setY(int y) { this->y = y;}  
    int getX(void) { return x;} 
    int getY(void) { return y;}  
    virtual int somefunc() = 0; 
    friend B operator- (B b1, B b2); 
};  

class B : public A 
{ 
    int somefunc() {return 0;} 
}; 

class C : public A 
{ 
    int somefunc() {return 1;} 
}; 

class D : public C 
{ 
    int somefunc() {return 2;} 
}; 
/* 
// 1 st attempt - fail 
A operator- (const A& a_inst, const A& a_inst2) 
{ 
    A a_temp; 
    a_temp.setX(a_inst.getX() - a_inst2.getX()); 
    a_temp.setY(a_inst.getY() - a_inst2.getY());  
    return a_temp; 
} 

// 2nd attempt - FAIL 
const A* operator- (const A* a1, const A* a2) 
{ 
    a1.setX(a1.getX() - a2.getX()); 
    a1.setY(a1.getY() - a2.getY()); 
    return a1; 
} 
//*/ 


//3rd attempt 
B operator- (B b1, B b2) 
{ 
    int temp1x = b1.getX(); 
    int temp2x = b2.getX(); 
    b1.setX(temp1x - temp2x); 

    int temp1y = b1.getY(); 
    int temp2y = b2.getY(); 
    b2.setY(temp1y - temp2y); 
    return b1; 
} 



int main() 
{ 
    B b(); 
    C c(); 

    b = b - dynamic_cast<B*>(c) ; 
} 

我明白的是,由於A是一個抽象類不能被實例化,所以我不能用類A實例來完成它。

是否有可能重載兩個+/-一次(每個)並使其適用於屬於此層次結構中的類的每個實例?此外,我想指出的是,我希望能夠做不同的類的對象,同樣的事情在同一時間,像這樣:

C c; 
B b; 
b = b - c; 

編輯1〜添加超載的第二個版本,我目前試圖去工作。

EDIT 2〜制定者

編輯3〜更正的錯誤的呼叫添加了第三個版本,仍然得到錯誤

+0

你知道你的結果應該是什麼類型嗎? D - D是否產生一個D? 「B - D」會合法嗎?如果是這樣,那麼結果類型是什麼? –

+0

@DrewDormann我想這是合法的。我想要做的是添加/減去x和y值(這個層次結構中的每個類都有它們)。無論類的(涉及)類型如何,這都適用。 (RE-EDITed) – Mechanic

+0

有沒有理由不能將它作爲A的成員函數實現? – awr

回答

2

有在你的代碼的一些問題:1。 應指定繼承類型:公共

class B : public A { 
    ... 
} 

2.乙操作符 - (常量乙& a_inst,常量乙& a_inst2)

{ 
    B a_temp; 
    a_temp.setX() = a.getX() - a_inst2.getX(); 
    a_temp.setY() = a.getY() - a_inst2.getY(); 

    return a_temp; 
} 

不能像那樣使用,因爲setX和setY返回的值不是指針或引用。