C/C++

Перегрузка оператора c++

Есть класс векторов с 3 координатами.
В классе перезагрузил операторы
например
void operator * (const NewClass& other) {
int x1 = this->m_x * other.m_x;
int x2 = this->m_y * other.m_y;
int x3 = this->m_z * other.m_z;
std::cout << (x1 + x2 + x3);
}
то есть
NewClass a;
NewClass b;
a.set_coords(1,5,10);
b.set_coords(10,3,4);

b * a;

скалярное произведение векторов по координатам,

однако если будет произведение вектора на число например
b *= 5
или NewClass c = b*5

как это реализовать, пробовал интуитивно такое

NewClass operator * (const NewClass, int alpha) {
NewClass temp1;
temp1.m_x = this->m_x * alpha;
temp1.m_y = this->m_x * alpha;
temp1.m_z = this->m_z * alpha;
return temp1;
}
и такое
NewClass operator * (const NewClass & int alpha)
и такое
friend * (const NewClass& other,aplha);
и т.д.

но в общем ничего не получилось, поэтому прошу Вас помочь с этим вопросом.
Aleksey Sokerin
Aleksey Sokerin
51
Для b*=5 нужно добавить в класс метод:
NewClass& operator*=(int alpha) {
    m_x *= alpha;
    m_y *= alpha;
    m_z *= alpha;
    return *this;
}
Умножение на число реализуем через уже написанный оператор *=:
NewClass operator*(int alpha) {
    return NewClass(*this) *= alpha;
}
Умножение числа на вектор пишем вне класса как функцию:
NewClass operator*(int alpha, NewClass v) {
    return v *= alpha;
}
Если умножение на число реализуем не через имеющийся оператор *=, то может понадобиться доступ к приватным полям класса, и придётся писать дружественную функцию (можно определить прямо в классе) - дублирование кода:
friend NewClass operator*(int alpha, NewClass v) {
    v.m_x *= alpha;
    v.m_y *= alpha;
    v.m_z *= alpha;
    return v;
}
Обратите внимание, что переменная temp не нужна, так как при передаче без ссылки мы и так получили копию.
Данил Гугин
Данил Гугин
20 861
Лучший ответ
Aleksey Sokerin Спасибо большое, очень помогли, но почему this-> спокойно работает в операторе +, а в моем коде, который почти как ваш, но не работает, он ругается на нее?
NewClass operator * (const NewClass, int alpha) {
NewClass temp1;
temp1.m_x = this->m_x * alpha;
temp1.m_y = this->m_x * alpha;
temp1.m_z = this->m_z * alpha;
return temp1;
}
Скаляр – это некоторое числовое значение. Стыдно такое не знать. Поэтому оператор произведение двух векторов должен возвращать некоторое значение.

// https://ru.wikipedia.org/wiki/Скалярное_произведение
#include <iostream>
#include <iomanip>
using namespace std;
class Vector3D {
public:
Vector3D() : x(0), y(0), z(0) {}
Vector3D(const double x, const double y, const double z) : x(x), y(y), z(z) {}
private:
double x;
double y;
double z;
friend double operator*(const Vector3D& a, const Vector3D& b) {
return a.x * b.x + a.y * b.y + a.z * b.z;
}
};
int main() {
Vector3D a{ 1.0, 3.0, -5.0 };
Vector3D b{ 4.0, -2.0, -1.0 };
auto scalar = a * b;
cout << fixed << setprecision(2) << scalar << '\n';
system("pause > nul");
}
Aleksey Sokerin извините, а зачем вы мой код переписали? я просил помочь с реализацией произведения вектора на ЧИСЛО, а не на другой вектор