tmp Var существует в своем объеме ... поэтому он существует только внутри оператора + = и _операции. Когда tmp выходит за рамки, вызывается деструктор. Правильный способ сделать это:
Var& Var::operator += (const Var& var)
{
_operation(*this, &var, *this, VAR_ADD);
return *this;
}
void Var::_operation(const Var& lhs, const Var& rhs, Var& res, VAR_OPERATOR op)
{
res == ...
// operations
// here the tmp variable has value
}
С + = оператором мы имеем в виду, что внутренние данные будут изменены (в данном случае, что * это + = вали), так Ther нет типа возвращаемого значения, или мы можем вернуться * это, чтобы ситуация как:
(v += val) - val2;
в v += val
будет называться operator +=
и Автошоу возвращения измененной v, теперь, если мы определим оператор - как friend Val operator - (const Val& lhs, const Val& rhs)
мы можем иметь сцепленные выражения.
То, что вы пытаетесь сделать, это:
Var Var::operator + (const Var& var1, const Var& var2)
{
Var tmp;
// internal stuff
return tmp;
}
Теперь этот оператор может быть другим
friend Var operator + (const Var& var1, const Var& var2)
{
Var tmp;
// internal stuff
return tmp;
}
Это еще не так, потому что мы должны определить конструктор копирования и оператор распайки! Поскольку верно, что temp будет уничтожен, но сначала мы можем вызвать конструктор копирования (или оператор-ассистент) таким образом, чтобы мы могли иметь «клон».
Все современные компиляторы C++ позволяют использовать функцию RVO (оптимизация возвращаемого значения), но это уже другая история.
Вы не выполнили свой конструктор копирования правильно? Кстати, почему актеры? Почему аргумент _operation не является указателем const? И если у вас есть веские основания для этого, пожалуйста, по крайней мере, используйте 'const_cast', чтобы отбросить константу вместо каста C-стиля. –
@SebastianRedl Да thx, я забыл конструктор копирования: S – pava91
Он должен быть const. Перегрузка операторов привела к соглашениям, которые исходят из интуитивного понимания математических операторов. Если вы делаете a = a + 5, вы не ожидаете, что 5 изменится, не так ли? Поэтому, если он изменяет аргумент правой стороны, дайте ему правильную функцию и не используйте оператор ... –