У меня есть класс с именем BigInteger, который поддерживает большие целочисленные операции. Я хочу реализовать смешанную операцию между BigInteger и встроенным типом int. Другими словами, я хочу поддержать следующие заявления
BigInteger a(10);
a + 10;
10 + a;
Я знаю, перегруженная функция может справиться с этим
BigInteger operator +(const BigInteger&, const int&);
BigInteger operator +(const int&, const BigInteger&);
Кроме того, я знаю, что оператор преобразования может иметь дело только с этим,
operator int();
Но вышеуказанная функция поддерживает преобразование BigInteger в int, которое потерять точность. Я ищу некоторые методы, которые будут проще, чем перегруженные функции и сохраняют точность.
Спасибо всем.
Я попробую,
#include <iostream>
using namespace std;
class BigInteger
{
public:
BigInteger(const int& i)
{
cout << "construct: " << i << endl;
val = i;
}
// BigInteger operator +(const BigInteger& tmp) const
// {
// return BigInteger(val + tmp.val);
// }
friend ostream& operator <<(ostream& os, const BigInteger& bi)
{
os << bi.val << endl;
return os;
}
int val;
};
BigInteger operator +(const BigInteger& a, const BigInteger& b)
{
return BigInteger(a.val + b.val);
}
int main(int argc, const char *argv[])
{
BigInteger a(12);
cout << (a + 123) << endl;
cout << (1231 + a) << endl;
return 0;
}
почему я не могу использовать функцию-член? Как это устроено?
Итак, сделайте конструктор BigInteger(int)
и определить BigInteger operator(const BigInteger &lhs, const BigInteger &rhs)
,
Вам нужно добавить конструктор, который будет принимать значение BigInteger
от int
BigInteger (const int& value)
Вы должны реализовать перегрузки для BigInteger operator+(BigInteger const&, int);
Как писал Херб Саттер и Андрей Александреску в «Стандартах кодирования C ++» (пункт 29), вам следует «подумать о перегрузке, чтобы избежать неявного диалога типов». Ваш BigInteger может использовать оператор new для строительства, которого можно избежать в данном конкретном случае. Дополнительно вы должны реализовать бинарную операцию в терминах унарной операции:
class BigInteger {
// ..
public:
BigInteger& operator+=(int); // this operation can reuse BigIntegers buffer
// ..
}
BigInteger operator+(BigInteger lhs, int rhs)
{
return lhs+=rhs;
}
BigInteger operator+(int lhs, BigInteger rhs)
{
return rhs+=lhs;
}
Убедитесь, что вы конвертируете только из int
в BigInteger
никогда не наоборот. Или сгенерируйте исключение, если обратное преобразование приведет к переполнению.
определить конструктор BigInteger (int) и перегрузить оператор BigInteger оператор + (const BigInteger &слева, const BigInteger &право).