2012-09-03 93 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); 
}