2012-09-03 118 views
1

我想提出一個包含將進一步推導分爲3種類型,即
PVector(像素空間矢量)
MVector(表空間矢量)
RVector一個GVector類(表達空間矢量)虛擬操作符重載

class GVector { 
    public : 
    eVectorSpace eVS; // Defines which space the vector would be 
    float x,y; // The x and y values of a 2-Dimensional vector 
    ... 
    GVector operator+ (const GVector& v) const { return GVector(x+v.x, y+v.y, v.eVS); } 
    ... 
}; 

class MVector { 
    public : 
    PVector toPVector() {...} 
    //Will contain functions to convert the same vector into a different space 
}; 

我想使它可以添加2個載體趴在同一空間

MVector operator+ (const MVector& v) const { return MVector(x+v.x, y+v.y); } 

我需要讓基類的功能類似 這個 ?

virtual GVector* operator+ (const GVector* v) const() = 0; 

但我想返回一個矢量在相同的空間作爲兩個添加向量。

添加x,y值的函數對於每種類型的向量都是相同的。 有沒有辦法將這個最小化到基類本身? 或者是否有更好的方法在相同的空間中添加矢量並將它們轉換爲不同的空間?

+0

如果在不同空間中的矢量被操作,該怎麼辦? –

+0

我想對僅位於同一空間的矢量執行操作。如果他們躺在不同的空間,那麼我打算使用轉換比率來轉換它們。 –

回答

2

如果對兩個不同的孩子執行操作沒有意義,那麼操作員應該在父級上定義而不是。相反,可以定義一個受保護的幫助函數,然後子代應該分別實現該操作符,並委託給幫助函數。

+0

你的意思是保護:GVector add(const GVector&)const {return GVector; }然後在相應的子類中調用此方法,然後將它們轉換爲所需的返回類型? 如果需要對不同的孩子進行操作,該怎麼辦?在基類中有一個枚舉來存儲它將會在哪個空間。我可以用它來檢查和執行操作。如果是的話,你可以提供什麼其他建議?謝謝 –

+1

你不需要*孩子*和*這個字段來描述它在哪個空間;你應該適當地使用一個或另一個。 –

+0

哦..你能解釋一下爲什麼這是一個壞主意,所以我可以在將來避免這種架構。 –

1

某些代碼需要知道如何將兩個矢量對象加在一起,但實際上它們本身並不需要是矢量類型。您可以在類之外定義一組加法運算符。

MVector operator+(const MVector &left, const MVector &right) { 
    return MVector(left.x + right.x, left.y + right.y); 
} 

您可以定義爲許多不同的運營商增加這樣的,只要你想,只要編譯器可以找出哪些類型是毫不含糊。您甚至可以提供接受MVectorGVector的實現。

MVector operator+(const MVector &left, const RVector &right) { 
    MVector tmp = right.toMVector(); 
    return MVector(left.x + tmp.x, left.y + tmp.y); 
}