Как сделать префиксную перегрузку бинарного оператора?
Всем привет! Имеется такое задание:
Нужно сделать два пункта: a и b. Пункт a я сделал, а вот пункт b не знаю как сделать. Не пойму как это сделать.
Вот что я сделал:
#include <iostream>
using namespace std;
class Test
{
int f;
public:
Test(int f)
{
this->f = f;
}
Test & operator + (int g)
{
this->f += g;
return *this;
}
void print()
{
cout << this->f << endl;
}
};
int main()
{
Test a(5);
a.print();
a + 5;
a.print();
return 0;
}
Ответы (2 шт):
Если бы вам не было нужно приватное поле, тогда можно было бы снаружи класса просто написать вот так:
Test &operator+(int g, Test &test)
{
test.f += g;
return test;
}
А чтобы иметь доступ к приватному полю, нужно:
Либо в класс добавить
friend Test &operator+(int g, Test &test);Либо, чтобы меньше писать, убрать оператор снаружи класса и вписать его тело внутрь класса, в конец строчки с
friend(вместо;):friend Test &operator+(int g, Test &test) {...}
Еще, обратите внимание, что задание предлагает выбрать не арифметический оператор, так что +,-,*,/ не подходят.
Как метод второй вариант не реализовать. Можно как функцию:
Test & operator +(int g, Test & test) {
...
return test;
}
Если нужен доступ к приватным полям класса Test, функцию надо объявить как дружественную в теле класс Test:
friend Test & operator +(int g, Test & test);
Но и моей функции и у вашего метода плохой дизайн. Ещё раз, плохой дизайн: оператор + не должен менять свои аргументы. Гораздо лучше вернуть новую копию объекта. Это ожидаемое поведение оператора:
Test operator +(int g) const
{
return Test(this->f + g);
}
Аналогично нужно изменить и функцию.
Обратите внимание что задание запрещает использовать операторы +, -, *, /.
