我希望了解一些在设计c++类时的最佳实践。
具体来说,我有一个名为Vec3的c++类。
class Vec3{
private:
float elements[3];
public:
Vec3(Vec3 v1){...}
Vec3(int x, int y, int z){...}
Vec3 add(Vec3 v1){...}
Vec3 add(int x, int y, int z){...}
...
Vec3 multiply(Vec3 v1){...}
...
int dotProduct(Vec3 v1){...}
Vec3 normalize(){...}
....
int operator[](int pos){...}
};
所以,我有一个处理大小为3的向量计算的类。我想知道什么更好。使用指针还是不使用指针。
我的参数应该是指针并返回指针吗?还是不用指针?
Vec3 add(Vec3 v1) 或 Vec3* add(Vec3 v1) 或 Vec3* add(Vec3* v1) 或者......
现在我很困惑,我不知道是否应该在我的类中使用指针。我想可能总有一种方法可以将我的参数发送到不处理指针的函数......
Vec3* v2 = new Vec3(1,1,1);
Vec3 sum = v1.add(*v2);
我想提供一个可能是最好的解决方案,即同时具备这两个功能。
Vec3 add(Vec3 v2){...}
Vec3* add(Vec3* v2){...}
但我担心这会导致重复的代码,可能会有额外的开销。
谢谢你的回答……顺便说一句,我可以使用模板来更改向量的大小,但我更喜欢保持我的Vec3类单独,并创建一个Vec4类或将其命名为四元数。
编辑 这是我想出的解决方案。请随意评论、修改或重用代码。 还有一件事。我只想提到,在我的情况下,这个类应该是透明的。就像我们添加数字一样。
int i = 10;
int j = 15;
int k = i + k;
如果add重载修改调用函数的对象,在这种情况下是i,那么我最终得到的k将成为对i的引用,而i被赋值为25。但是我们真正想要的是k等于25,而i、k不变。
这就是我的类如何工作的。Vec3 k = i + k不会修改i或k,因为我们正在从这些值创建一个新数字。唯一需要返回引用的情况是+=、-=、++、--...,set([XYZ])?和normalize。
做一些像myvec.setX(10).normalize().scale(10)这样的事情可能很有趣。
注意:scale应该返回一个引用。我没有看到它,但我想这样可能更好。
Vec3 t = myvec.normalize().scale(100).copy();
谢谢大家,我现在将开始处理Matrix类。