Я пытаюсь написать функцию для оператора +=
класса C++, который использует уже написанную +
операторную функцию. До сих пор мне не удалось связать this
указатель с оператором +
. Вот некоторые из попыток, которые я сделал, которые были скомпилированы в g++
но не дали желаемого результата. Дважды я попытался просто сделать копию this
класса, но это, похоже, не сработало.
intstr& intstr::operator+=(const intstr& i)
{
intstr *a;
a = new intstr;
*a = *this + i;
return *a;
}
intstr& intstr::operator+=(const intstr& i)
{
intstr *a, b(*this);
a = new intstr;
*a = b + i;
return *a;
}
intstr& intstr::operator+=(const intstr& i)
{
intstr *a, *b;
a = new intstr;
b = this;
*a = *b + i;
return *a;
}
intstr& intstr::operator+=(const intstr& i)
{
intstr *a;
a = new intstr;
*a = this->operator+(i);
return *a;
}
В тестовом коде все, что я сделал, заменяет рабочую строку кода a = a + i
с a += i
, поэтому я сомневаюсь, что там лежит проблема, но это возможно. Это единственный способ сделать это, чтобы скопировать код из +
оператора в +=
функции?
Оператор может выглядеть так:
intstr& intstr::operator+=( const intstr& i )
{
*this = *this + i;
return *this;
}
Если operator +
объявлен как функция класса, то вы также можете написать
intstr& intstr::operator+=( const intstr& i )
{
*this = operator +( i ); // or *this = this->operator +( i );
return *this;
}
Было бы ошибкой динамически выделять объект типа intstr внутри оператора. По крайней мере, такой необходимости не требуется.
Обычно подход противоположный: вы реализуете operator+=
а затем реализуете operator+
с использованием этой реализации (создаете копию первого аргумента, затем используйте +=
для увеличения по второму аргументу и возвращайте это).
Кроме этого, почему вы вызываете new
во всех версиях? Для operator+=
вам вообще не нужно создавать какой-либо новый объект. Оператор должен изменить значение левого операнда, увеличив его до значения правой стороны. Нигде не нужно создавать новые объекты (и тем более динамически выделять new
!)
Обычно вы делаете это наоборот:
intstr& intstr::operator+=(intstr const& rhs)
{
// Do this stuff to add rhs into this object.
return *this;
}
// Then + is implemented in terms of +=
intstr intstr::operator+(intstr const& rhs)
{
instr result(*this); // Make a copy as the result
result += rhs;
return result;
}
// Then your free functions as needed.
operator+
создает новое значение, которое вы возвращаете по значению, чтобы вывести его из функции.