如何重载可以处理 class largeIntegers 对象的 + 运算符,它可以在数组中存储最多 100 位数字?

How to overload + operator that can work on objects of class largeIntegers that can store a number upto 100 digits in an array?

我正在从 D.S 的一本名为“使用 C++ 的数据结构”的书中学习数据结构。马利克。我目前正在解决以下书面编程练习:

在C++中,最大的int值是2147483647。所以比这个大的整数 不能作为整数存储和处理。同样,如果总和或乘积 两个正整数大于 2147483647,结果会不正确。 存储和操作大整数的一种方法是存储每个单独的数字 数组中的数字。设计 class largeIntegers 以便 此 class 的对象可以存储最多 100 位的整数。超载 运算符 + 和 – 分别加减两个对象的值 其中 class。 (在第 3 章的编程练习中,我们将重载 乘法运算符。)重载赋值运算符以复制 一个大整数的值转换成另一个大整数。过载流 提取和插入运算符,便于输入和输出。你的程序 必须包含适当的构造函数来初始化 class 的对象 大整数。 (提示:将数字作为字符串读取并存储数字 序号相反。添加实例变量来存储数量 数字和数字的符号。)

下面是我的代码:

#include <bits/stdc++.h>

using namespace std;

class largeIntegers {
private:
  /* data */
  int num[100] = {0};
  int digits;
  bool isPositive;

public:
  friend istream &operator>>(istream &, largeIntegers &);
  largeIntegers &operator+(largeIntegers &);
  void getLargeInteger(void);
  void setLargeInteger(string);
  void print(void);
  largeIntegers();
  largeIntegers(string);
};

int main() {
  largeIntegers num1;
  cin >> num1;
  largeIntegers num2;
  num2 = num1;
  cin >> num1;

  largeIntegers num3;
  num3 = num1 + num2;
  num3.print();
  return 0;
}

largeIntegers &largeIntegers::operator+(largeIntegers &integer) {
  largeIntegers temp;
  int remainder = 0;
  int digi = max(digits, integer.digits);
  temp.digits = digi;
  for (int i = 0; i < digi; i++) {
    temp.num[i] = (remainder + num[i] + integer.num[i]) % 10;
    remainder = (remainder + num[i] + integer.num[i]) / 10;
  }
  if (remainder) {
    temp.num[digi] = remainder;
    temp.digits++;
  }

  return temp;
}

largeIntegers::largeIntegers(string n) { setLargeInteger(n); }

largeIntegers::largeIntegers() {
  isPositive = true;
  digits = 0;
}

void largeIntegers::setLargeInteger(string n) {
  int start = 0;
  if (n[0] == '-') {
    isPositive = false;
    start = 1;
  }
  digits = 0;
  for (int i = n.length() - 1; i >= start; i--) {
    num[digits] = int(n[i]) - int('0');
    digits++;
  }
}

void largeIntegers::getLargeInteger(void) {
  cout << "Enter a large integer:\n";
  string n;
  cin >> n;
  setLargeInteger(n);
}

istream &operator>>(istream &isObject, largeIntegers &largeInt) {
  string num;
  isObject >> num;
  largeInt.setLargeInteger(num);

  return isObject;
}

void largeIntegers::print(void) {
  if (!isPositive)
    cout << "-";
  for (int i = digits - 1; i >= 0; i--) {
    cout << num[i];
  }
  cout << endl;
}

但是我的代码不适用于加法运算。它给出 Segmentation fault (core dumped) 错误。谁能解释一下问题是什么以及如何解决?

问题是您的重载 operator+ 正在返回对局部变量的引用。要解决这个问题,您可以改用以下版本的operator+

//return by value 
largeIntegers operator+(const largeIntegers &lhs, const largeIntegers &integer)
{
   largeIntegers temp;
  int remainder = 0;
  int digi = max(lhs.digits, integer.digits);
  temp.digits = digi;
  for (int i = 0; i < digi; i++) {
    temp.num[i] = (remainder + lhs.num[i] + integer.num[i]) % 10;
    remainder = (remainder + lhs.num[i] + integer.num[i]) / 10;
  }
  if (remainder) {
    temp.num[digi] = remainder;
    temp.digits++;
  }

  return temp;
}

为了使上述工作正常,通过在 class:

中添加如下好友声明,使 operator+ 成为好友
friend largeIntegers operator+(const largeIntegers &lhs, const largeIntegers &rhs);

可以看到使用上述修改的完整工作程序here并在下面给出:

#include <bits/stdc++.h>

using namespace std;

class largeIntegers {
private:
  /* data */
  int num[100] = {0};
  int digits;
  bool isPositive;

public:
  friend istream &operator>>(istream &, largeIntegers &);
  //i have added this friend declaration
  friend largeIntegers operator+(const largeIntegers &lhs, const largeIntegers &rhs);
  void getLargeInteger(void);
  void setLargeInteger(string);
  void print(void);
  largeIntegers();
  largeIntegers(string);
};

int main() {
  largeIntegers num1;
  cin >> num1;
  largeIntegers num2;
  num2 = num1;
  cin >> num1;

  largeIntegers num3;
  num3 = num1 + num2;
  num3.print();
  return 0;
}
//i have modified the operator+ as shown below
largeIntegers operator+(const largeIntegers &lhs, const largeIntegers &integer)
{
   largeIntegers temp;
  int remainder = 0;
  int digi = max(lhs.digits, integer.digits);
  temp.digits = digi;
  for (int i = 0; i < digi; i++) {
    temp.num[i] = (remainder + lhs.num[i] + integer.num[i]) % 10;
    remainder = (remainder + lhs.num[i] + integer.num[i]) / 10;
  }
  if (remainder) {
    temp.num[digi] = remainder;
    temp.digits++;
  }

  return temp;
}


largeIntegers::largeIntegers(string n) { setLargeInteger(n); }

largeIntegers::largeIntegers() {
  isPositive = true;
  digits = 0;
}

void largeIntegers::setLargeInteger(string n) {
  int start = 0;
  if (n[0] == '-') {
    isPositive = false;
    start = 1;
  }
  digits = 0;
  for (int i = n.length() - 1; i >= start; i--) {
    num[digits] = int(n[i]) - int('0');
    digits++;
  }
}

void largeIntegers::getLargeInteger(void) {
  cout << "Enter a large integer:\n";
  string n;
  cin >> n;
  setLargeInteger(n);
}

istream &operator>>(istream &isObject, largeIntegers &largeInt) {
  string num;
  isObject >> num;
  largeInt.setLargeInteger(num);

  return isObject;
}

void largeIntegers::print(void) {
  if (!isPositive)
    cout << "-";
  for (int i = digits - 1; i >= 0; i--) {
    cout << num[i];
  }
  cout << endl;
}

查看上面代码中的注释来检查我所做的修改