Классы C ++: создать копию класса «this» внутри функции-члена

0

Я пытаюсь написать функцию для оператора += класса 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, поэтому я сомневаюсь, что там лежит проблема, но это возможно. Это единственный способ сделать это, чтобы скопировать код из + оператора в += функции?

Теги:
class
operator-keyword

3 ответа

1
Лучший ответ

Оператор может выглядеть так:

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 внутри оператора. По крайней мере, такой необходимости не требуется.

  • 0
    Спасибо, это сработало! Я знал, что должен быть простой способ сделать это.
  • 0
    @Vlad Это тоже нормально, если мы используем return (operator + (i)); ?
Показать ещё 1 комментарий
2

Обычно подход противоположный: вы реализуете operator+= а затем реализуете operator+ с использованием этой реализации (создаете копию первого аргумента, затем используйте += для увеличения по второму аргументу и возвращайте это).

Кроме этого, почему вы вызываете new во всех версиях? Для operator+= вам вообще не нужно создавать какой-либо новый объект. Оператор должен изменить значение левого операнда, увеличив его до значения правой стороны. Нигде не нужно создавать новые объекты (и тем более динамически выделять new !)

  • 0
    Спасибо за быстрый ответ! Сначала я не думал, что мне нужно «новое», но только когда я использовал его, мой код компилировался, поэтому я просто пошел с ним. Я никогда не думал использовать «+ =» первым и получить «+» из этого - приятно знать! Я попробую это.
0

Обычно вы делаете это наоборот:

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.
  • 0
    Я не уверен .. не думаете ли вы, что объект результата будет уничтожен в конце операторной функции?
  • 0
    @sameerkarjatkar: Нет, оно будет возвращено по значению. Помните, что operator+ создает новое значение, которое вы возвращаете по значению, чтобы вывести его из функции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню