как преобразовать встроенный тип в пользовательский тип

У меня есть класс с именем 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;
}

почему я не могу использовать функцию-член? Как это устроено?

0

Решение

Итак, сделайте конструктор BigInteger(int)и определить BigInteger operator(const BigInteger &lhs, const BigInteger &rhs),

3

Другие решения

Вам нужно добавить конструктор, который будет принимать значение BigInteger от int

BigInteger (const int& value)
4

Вы должны реализовать перегрузки для 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;
}
3

Убедитесь, что вы конвертируете только из int в BigIntegerникогда не наоборот. Или сгенерируйте исключение, если обратное преобразование приведет к переполнению.

1

определить конструктор BigInteger (int) и перегрузить оператор BigInteger оператор + (const BigInteger &слева, const BigInteger &право).

0
По вопросам рекламы [email protected]