Оператор перегрузки + в C ++ - PullRequest
5 голосов
/ 01 марта 2010

Хорошо, я работаю над книгой и пытаюсь научиться перегружать оператор C ++. Я создал класс BigInt, который принимает один int (изначально равный 0) для конструктора. Я перегружен метод + =, и он прекрасно работает в следующем коде:

BigInt x = BigInt(2);
x += x;
x.print( cout );

Код выведет 4. Итак, я работал над перегрузкой глобального оператора +, используя следующий код:

BigInt operator+(const BigInt lhs, const BigInt rhs)
{
    BigInt returnValue(lhs);
    returnValue += rhs;
    return returnValue;
}

Это также хорошо работает для следующего кода:

BigInt x = BigInt(1);
BigInt y = BigInt(5);
BigInt z = x + y;
z.print();

Это распечатывает 6. Однако, когда я пытаюсь выполнить следующий код, он просто не работает. Книга не очень хорошо объясняет и подразумевает, что она должна просто работать.

BigInt x = BigInt(1);
BigInt z = x + 5;
z.print();

Это печатает 1. Я не уверен, почему z равен 1, когда должно быть 6. Я гуглил онлайн и на stackoverflow, но я не смог найти никого другого, у которого была проблема точно такая некоторые были близки, но ответы просто не подходили. Любая помощь очень ценится!

Ответы [ 4 ]

3 голосов
/ 01 марта 2010

наиболее вероятная проблема в операторе +=. Почтовый индекс для него.

2 голосов
/ 01 марта 2010

Вам нужна перегрузка для добавления int в BigInt; константа 5 в вашем примере имеет тип int, а не BigInt. Примерно так должно работать:

BigInt operator+(const BigInt lhs, const int rhs)
{
    BigInt returnValue(rhs);
    returnValue += lhs;
    return returnValue;
}

Возможно, вы тоже захотите один для operator+(const int lhs, const BigInt rhs).

1 голос
/ 01 марта 2010

Следующий супер-упрощенный код (минимум, который я могу добавить, чтобы включить весь ваш код и превратить его в допустимую автономную исполняемую программу):

#include <iostream>

class BigInt
{
  public:
    BigInt(int i): _i(i) {}
    void print() { std::cout << "BigInt(" << _i << ")\n"; }
    void operator +=(const BigInt rhs) { _i += rhs._i; }
  private:
    int _i;
};

BigInt operator+(const BigInt lhs, const BigInt rhs)
{
    BigInt returnValue(lhs);
    returnValue += rhs;
    return returnValue;
}

int main() {
  BigInt x = BigInt(1);
  BigInt y = BigInt(5);
  BigInt z = x + y;
  z.print();

  BigInt ax = BigInt(1);
  BigInt az = ax + 5;
  az.print();

  return 0;
}

испускает, как и ожидалось:

BigInt(6)
BigInt(6)

Пожалуйста, внесите как можно меньше изменений в этот рабочий код, чтобы воспроизвести обнаруженную ошибку - это, конечно, покажет, где именно находится ваша ошибка.

0 голосов
/ 01 марта 2010

Код, который вы разместили, выглядит хорошо и должен работать. Проблемы, которые вы видите, почти наверняка связаны с конструктором копирования или оператором присваивания вашего класса BigInt.

...