Есть класс векторов с 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);
и т.д.
но в общем ничего не получилось, поэтому прошу Вас помочь с этим вопросом.
C/C++
Перегрузка оператора c++
Для 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 не нужна, так как при передаче без ссылки мы и так получили копию.
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 не нужна, так как при передаче без ссылки мы и так получили копию.
Скаляр – это некоторое числовое значение. Стыдно такое не знать. Поэтому оператор произведение двух векторов должен возвращать некоторое значение.
// 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");
}
// 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
извините, а зачем вы мой код переписали? я просил помочь с реализацией произведения вектора на ЧИСЛО, а не на другой вектор
Похожие вопросы
- Перегрузка операторов ввода-вывода для файловых потоков
- Операторы преобразования типов в C++
- Как разработать динамические переменные с помощью оператора new и при этом удалены оператором delete C++? Можно пример?
- Где сработает этот код перегрузки функции: на Си или на C++, и почему?
- Задание 4 по Теме Функции. Перегрузка Функций. Рекурсия. На языке программирования C++
- C++ помогите пожалуйста Организация ветвления с использованием оператора выбора
- Какие из этих книг вы посоветуете прочесть в первую очередь чтобы повысить свои знания в C/C++?
- Логический оператор И и ИЛИ в Си
- Задача по C++
- День добрый \[-_-]/ вопрос по вузовскому программированию на си(C)
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;
}