2013-06-21 5 views
0

Не могу понять, почему, когда один мой метод возвращает объект, объект будет уничтожен.Объект уничтожается перед возвратом

Опубликовать здесь классную структуру и методы.

class Var 
{ 
public: 
    Var operator += (const Var& var); 
private: 
    Var _operation(Var* var, VAR_OPERATOR op); 
} 

Метод:

Var Var::operator += (const Var& var) 
{ 
    Var tmp = this->_operation((Var *)&var,VAR_ADD); 
    return tmp; // here the tmp variable is void 
} 
Var Var::_operation(Var* var, VAR_OPERATOR op) 
{ 
    Var tmp; 
    // operations 
    // here the tmp variable has value 
    return tmp; 
} 

Кто-нибудь знает почему?

+9

Вы не выполнили свой конструктор копирования правильно? Кстати, почему актеры? Почему аргумент _operation не является указателем const? И если у вас есть веские основания для этого, пожалуйста, по крайней мере, используйте 'const_cast', чтобы отбросить константу вместо каста C-стиля. –

+0

@SebastianRedl Да thx, я забыл конструктор копирования: S – pava91

+0

Он должен быть const. Перегрузка операторов привела к соглашениям, которые исходят из интуитивного понимания математических операторов. Если вы делаете a = a + 5, вы не ожидаете, что 5 изменится, не так ли? Поэтому, если он изменяет аргумент правой стороны, дайте ему правильную функцию и не используйте оператор ... –

ответ

1

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 (оптимизация возвращаемого значения), но это уже другая история.

+0

Я не хочу использовать «это» в качестве результата, мне нужна другая переменная: S – pava91

+2

, поэтому вы выбираете неправильный оператор, используйте оператор + вместо –

+0

с некоторым исправлением i исправить все. операторы работают! – pava91