我有一个名为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 :(得分:4)
您需要添加从int
获取值BigInteger
的构造函数
BigInteger (const int& value)
答案 1 :(得分:3)
因此,创建一个构造函数BigInteger(int)
,并定义一个BigInteger operator(const BigInteger &lhs, const BigInteger &rhs)
。
答案 2 :(得分: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;
}
答案 3 :(得分:1)
确保您只是从int
转换为BigInteger
,而不是相反。或者,如果反向转换会导致溢出,则抛出异常。
答案 4 :(得分:0)
定义构造函数BigInteger(int)并重载运算符BigInteger operator +(const BigInteger&amp; left,const BigInteger&amp; right)。