1

我正在制作一个包含将进一步派生为 3 种类型的 GVector 类,即
PVector(像素空间矢量)
MVector(米空间矢量)
RVector(渲染空间矢量)

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 的值相加的功能是相同的。有没有办法将其最小化到基类本身?或者有没有更好的方法在同一空间中添加向量并将它们转换为不同的空间?

4

2 回答 2

2

如果对两个不同的子级执行操作没有意义,则不应父级上定义运算符。相反,可以定义一个受保护的辅助函数,然后孩子应该单独实现运算符,委托给辅助函数。

于 2012-09-03T02:32:07.117 回答
1

某处的某些代码需要知道如何将两个向量对象相加,但实际上并不需要是向量类型本身。您可以在类之外定义一组加法运算符。

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

您可以根据需要定义任意数量的不同运算符添加,只要编译器可以明确地确定类型是什么。您甚至可以提供接受 aMVector和 a 的实现GVector

MVector operator+(const MVector &left, const RVector &right) {
    MVector tmp = right.toMVector();
    return MVector(left.x + tmp.x, left.y + tmp.y);
}
于 2012-09-03T03:12:39.797 回答