[C++] примитивный вопрос по классам
а чего пишется в ошибке? too many parametrs?
судя по тому, что в теле присутствуют члены некоего класса, эта перегрузка внутри класса => у этого оператора лишний входной параметр...
сделай эту функцию глобальной и пропиши ее friend-ом в классе и соответственно, замени v[i]=v1.v[i]*vc на v1.v[i]*=vc; а также оставь второй вариант оператора в классе...
а зачем возвращать ссылку? а не значение?
судя по тому, что в теле присутствуют члены некоего класса, эта перегрузка внутри класса => у этого оператора лишний входной параметр...
сделай эту функцию глобальной и пропиши ее friend-ом в классе и соответственно, замени v[i]=v1.v[i]*vc на v1.v[i]*=vc; а также оставь второй вариант оператора в классе...
а зачем возвращать ссылку? а не значение?
Затем, чтобы тут:
не вызывался конструктор копирования при умножении на 3.
vector v;
v*2*3;
не вызывался конструктор копирования при умножении на 3.
Да, бинарные операторы надо выносить в global, и прописывать их friend в своём классе.
спасиба
для данного примера совершенно не обязательно делать умножение френдом ( потому как доступ весь нужный получается через паблик методы думаю ругается он потому, что ты получаешь cons vector& и видимо после умножения возвращаешь полученный вектор, но уже в виде vector&. вообще семантика операторов бинарных такова что они возвращают Т, а не Т&; Т& возвращают как правило операторы с присваиванием типа *=.
А если написать что-нибудь вроде v*2 + v*3?
budet v*5, а собственно зачем?
Если в результате умножения возвращается ссылка, то разве не получится, что ссылки на v*2 и на v*3 совпадут?
Ну совпадут. И что?
Данная запись вообще всегда будет неверный результат давать, что копируй, что не копируй, потому что при этом меняется содержимое вектора.
Другое дело, что можно написать по-другому и копировать локальную относительно оператора переменную. Тогда выражение будет посчитано правильно.
Данная запись вообще всегда будет неверный результат давать, что копируй, что не копируй, потому что при этом меняется содержимое вектора.
Другое дело, что можно написать по-другому и копировать локальную относительно оператора переменную. Тогда выражение будет посчитано правильно.
Это как? Примерно обрисуй
У него вообще нет описания класса, поэтому нельзя говорить, что весь доступ есть через паблик методы. А даже если бы и был, то всё равно лучше писать friend'ы. Так же в примерах у него вообще не было return в его операторах, и ругался компилятор на неправильную попытку перегрузки operator* И да, я согласен что из некоторых операторов лучше возвращать новый объект.
Ну надо писать так, чтобы математическая запись давала правильный результат, т.е. 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;
}
}
Оставить комментарий
geja_03
Пачиму это не компилится?
Проблема в том что это
дает умножение тока с одной стороны