Ваш код содержит несколько ошибок и недочетов, которые могут приводить к неправильному поведению. Давайте разберем основные проблемы и улучшим вашу реализацию.
1. **Использование `calloc` и `realloc`:** В вашем конструкторе вы используете `calloc` для начальной инициализации массива, а затем `realloc` - это может привести к потерям данных, если `realloc` не может уменьшить размер массива, и новый размер больше, чем старый. Лучше использовать стандартный контейнер, например, `std::vector`.
2. **Неправильный способ заполнения массива:** Ваша логика заполнения массива в конструкторе класса `BigInteger` некорректна. Функция `get_two_last(num)` не изменяет значение `num` таким образом, как вы ожидаете. В результате массив может содержать неправильные значения.
3. **Уничтожение массива в деструкторе:** Вместо `delete(arr)`, который вызывается для указателей, вам нужно использовать `free(arr)`, так как вы выделяли память с помощью `calloc` или `malloc`.
4. **Некорректные операции со знаками и длинный int:** Если переданное число слишком велико для типа `int`, это может привести к потере значений.
5. **Проблемы с доступом к элементам массива:** Использование неверного индекса для доступа к элементам массива может привести к ошибкам в расчете.
Вот исправленная версия вашего кода:
```cpp
#include <iostream>
#include <vector>
class BigInteger {
public:
std::vector<int> arr; // Используем vector для удобства
int sign;
// Конструктор по умолчанию
BigInteger() : arr(1, 0), sign(1) {}
// Конструктор с параметром
BigInteger(int num) : BigInteger() {
if (num < 0) {
sign = -1;
num = -num; // Работаем с положительным числом
} else {
sign = 1;
}
while (num > 0) {
arr.push_back(num % 100); // Храним по 2 цифры
num /= 100;
}
}
// Печать числа в удобном формате
void print() const {
if (sign == -1) std::cout << '-';
for (size_t i = arr.size(); i > 0; --i) {
std::cout << (arr[i-1] < 10 ? "0" : "") << arr[i-1]; // Форматируем вывод
}
if (arr.size() == 1 && arr[0] == 0) {
std::cout << '0'; // Если число равно нулю
}
std::cout << std::endl;
}
};
int main() {
BigInteger bigInt(123456);
bigInt.print(); // Ожидаемый вывод: 123456
BigInteger bigIntNeg(-123456);
bigIntNeg.print(); // Ожидаемый вывод: -123456
return 0;
}
```
В данном примере:
- Мы используем `std::vector`, чтобы управлять массивом чисел.
- Переписываем логику инициализации, так что все числа, включая отрицательные, обрабатываются корректно.
- Реализуем вспомогательную функцию `print` для представления числа в читаемом виде.
Постарайтесь следовать этим рекомендациям и использовать возможности стандартной библиотеки C++ для упрощения кода и управления памятью.