Я хотел бы узнать некоторые рекомендации при разработке классов C ++.
Чтобы поместить это в контекст, у меня есть класс c ++ с именем Vec3.
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 или назвать его Quaternion.
EDIT
Вот решение, с которым я пришел. Не стесняйтесь комментировать или изменять или повторно использовать код.
Одна вещь. Я просто хочу отметить, что в моем случае этот класс должен быть прозрачным. Также как мы добавляем числа.
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])? и нормализовать.
Может быть интересно сделать что-то вроде myvec.setX (10) .normalize (). Scale (10)
ПРИМЕЧАНИЕ: весы должны возвращать ссылку. Я этого не видел, но думаю, так должно быть лучше.
Vec3 t = myvec.normalize().scale(100).copy();
http://pastebin.com/f413b7ffb
Спасибо всем, сейчас я буду работать над классом Matrix.