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

BigIntegerfrom intの値を取るコンストラクタを追加する必要があります

BigInteger (const int& value)
于 2013-04-15T09:08:31.773 に答える
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 に答える
3

したがって、コンストラクターを作成しBigInteger(int)、 を定義しますBigInteger operator(const BigInteger &lhs, const BigInteger &rhs)

于 2013-04-15T09:08:46.783 に答える
1

intからへの変換のみを行っており、その逆ではないことを確認してくださいBigInteger。または、逆変換によってオーバーフローが発生する場合は、例外をスローします。

于 2013-04-15T09:09:27.820 に答える
0

コンストラクタ BigInteger(int) を定義し、オペレータ BigInteger operator+(const BigInteger &left, const BigInteger &right) をオーバーロードします。

于 2013-04-15T09:26:12.863 に答える