如何将内置类型转换为用户定义的类型

时间:2013-04-15 09:06:23

标签: c++ conversion-operator

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

为什么我不能使用会员功能?它是如何工作的?

5 个答案:

答案 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)。