[C++] примитивный вопрос по классам

geja_03

	vector& operator* (const double vc, const vector& v1)
{
for (int i=0;i<sz; i++)
{
v[i]=v1.v[i]*vc;
}
}

Пачиму это не компилится?
Проблема в том что это
vector& operator* (double vc)
{
for (int i=0;i<sz; i++)
{
v[i]*=vc;
}
}

дает умножение тока с одной стороны

marizha

а чего пишется в ошибке? too many parametrs?
судя по тому, что в теле присутствуют члены некоего класса, эта перегрузка внутри класса => у этого оператора лишний входной параметр...
сделай эту функцию глобальной и пропиши ее friend-ом в классе и соответственно, замени v[i]=v1.v[i]*vc на v1.v[i]*=vc; а также оставь второй вариант оператора в классе...
а зачем возвращать ссылку? а не значение?

tipnote

Затем, чтобы тут:

vector v;
v*2*3;

не вызывался конструктор копирования при умножении на 3.

kokoc88

Да, бинарные операторы надо выносить в global, и прописывать их friend в своём классе.

geja_03

спасиба

AVGO

для данного примера совершенно не обязательно делать умножение френдом ( потому как доступ весь нужный получается через паблик методы думаю ругается он потому, что ты получаешь cons vector& и видимо после умножения возвращаешь полученный вектор, но уже в виде vector&. вообще семантика операторов бинарных такова что они возвращают Т, а не Т&; Т& возвращают как правило операторы с присваиванием типа *=.

Zoulla

А если написать что-нибудь вроде v*2 + v*3?

geja_03

budet v*5, а собственно зачем?

Zoulla

Если в результате умножения возвращается ссылка, то разве не получится, что ссылки на v*2 и на v*3 совпадут?

tipnote

Ну совпадут. И что?
Данная запись вообще всегда будет неверный результат давать, что копируй, что не копируй, потому что при этом меняется содержимое вектора.
Другое дело, что можно написать по-другому и копировать локальную относительно оператора переменную. Тогда выражение будет посчитано правильно.

geja_03

Это как? Примерно обрисуй

kokoc88

У него вообще нет описания класса, поэтому нельзя говорить, что весь доступ есть через паблик методы. А даже если бы и был, то всё равно лучше писать friend'ы. Так же в примерах у него вообще не было return в его операторах, и ругался компилятор на неправильную попытку перегрузки operator* И да, я согласен что из некоторых операторов лучше возвращать новый объект.

kokoc88

Ну надо писать так, чтобы математическая запись давала правильный результат, т.е. 10*2+10*3=50, а не 120. Для этого надо создавать новые объекты, что-то типа:

V operator* (const int m, V& v)
{
V newV;
newV.m_n = v.m_n*m;
return newV;
}
V operator* (V& v, const int m)
{
return operator*(m, v);
}
class V
{
public:
V operator+ (const V& v)
{
V newV;
newV.m_n = m_n;
newV.m_n += v.m_n;
return newV;
}
}
Оставить комментарий
Имя или ник:
Комментарий: