У меня есть решение для вас и предупреждение о перегрузке вашего оператора.
Решение:
#include <iostream>
using namespace std;
struct Element {
double d;
Element(double d) {this->d = d;}
Element operator*(const Element &obj) {
d *= obj.d;
return *this;
}
};
Element operator*(const int i, const Element& e) {
return Element(static_cast<double>(i) * e.d);
}
ostream& operator<<(ostream& os, const Element& e) {
os << e.d;
return os;
}
int main() {
Element e(2);
cout << "Product of 8 and e: " << 8*e << '\n';
// This shows why your overload is a bad idea:
Element a(3);
cout << "a is " << a << '\n'; // prints 3
cout << "Now its product with e is: " << a*e << '\n'; // prints 6
cout << "Surprise: a is now " << a << '\n'; // prints 6
}
Ваша первоначальная перегрузка не сработала, потому что она даже не вызывалась. Ваше выражение было похоже на
a = 8*c
, где 8 имеет тип int, и когда C ++ анализирует это выражение слева направо, он видит, что 8 имеет тип int, и пытается найти перегрузку оператора * (const Element &) в типе int, и он не может найти его потому что он не знает и не должен ничего знать о вашем собственном определяемом пользователем типе. Поэтому, если вы хотите, чтобы ваш собственный класс взаимодействовал с другими типами, вам нужно либо встроить перегрузку оператора * как функции-члена в этот другой тип, либо объявить его как внешнюю функцию, как я делал в своем решении.
Теперь предупреждение. Ваша первоначальная перегрузка оператора плохо определена, потому что она изменяет исходный объект, что считается неожиданным поведением. Я показываю это в коде выше. Это как умножение 8 на 2 даст вам 16, но в то же время получится 16 из ваших 8. Что вы действительно хотите сделать, так это создать новый элемент в вашем операторе умножения и вернуть его:
struct Element {
double d;
Element(double d) {this->d = d;}
Element operator*( const Element &obj) {
return Element(this->d * obj.d);
}
};
Черт, эти ответы занимают много времени ... Я должен работать, хотя: \