I've been doing lots of vector math stuff and wrote my own template for it.
My requirements are lots of vector maths (addition, subtraction, scale, cross prod, and dot prod) also I need to be able to pass my vector as a float[] so that openGL can make use of it.
I've been using this quite happily for sometime, today a lecturer saw it and groaned. There was two things he particularly hated (one of which I understand), my use of inheritance because it didn't seem to follow an is a
style. And my casting (T*)this
, of course he didn't have much in the way of a solution.
First: The inheritance, I need to be able to make use of vec2 to vec4's so I designed my vectors like this.
template<typename T>
Vector2D
{
public:
getX(), getY(), setX(), setY() ....
};
template<typename T>
Vector3D : public Vector2D<T>
{
public:
getZ(), setZ() ...
}
template<typename T>
Vector4D : public Vector3D<T>
{
public:
getW(), setW() ...
}
Why is this bad? and tbh I can't see how to improve it. I need(want) to be able to define type and have getters and setters of some sort. If I rearranged it like
template<typename T, int _size>
VectorT
I'd loose my .getX()
, .setX()
stuff and have to replace it with something like .at()
or []
. tbh I prefer the readability of .getX()
, although it would make operator definitions easier.
Second: I can see why this is bad, but to make it so I can pass these vectors into openGL's method that expect a float array I've overloaded the splat operator
// Defined in Vector2D<T>
operator*() { return (T*)this; }
As I understand it, there is no guarantee that the compiler will put the member variables x,y,z,w at the beginning of the class, and if not careful I might end up passing the v-table instead. However I must admit I've had no problems so far.
The only way I can see around this is to maintain an array that gets returned. Which I suppose would be easier if I changed they way I deal with vectors in the first place.