0

我有一个名为 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;
}

为什么我不能使用成员函数?这个怎么运作?

4

5 回答 5

4

您需要添加BigInteger将从 int获取值的构造函数

BigInteger (const int& value)
于 2013-04-15T09:08:31.773 回答
3

因此,创建一个构造函数BigInteger(int),并定义一个BigInteger operator(const BigInteger &lhs, const BigInteger &rhs).

于 2013-04-15T09:08:46.783 回答
3

您应该为BigInteger operator+(BigInteger const&, int);Herb Sutter 和 Andrei Alexandrescu 在 C++ 编码标准(第 29 项)中所写的实现重载,您应该“考虑重载以避免隐式类型对话”。您的 BigInteger 可能会使用 operator 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;
}
于 2013-04-15T09:24:20.870 回答
1

确保你只是从intto转换,而BigInteger不是反过来。或者,如果反向转换会导致溢出,则抛出异常。

于 2013-04-15T09:09:27.820 回答
0

定义构造函数 BigInteger(int) 并重载运算符 BigInteger operator+(const BigInteger &left, const BigInteger &right)。

于 2013-04-15T09:26:12.863 回答