2017-05-07 19 views
-3

C++でBigIntegerクラスを構築する必要があります。 BigIntは、固定サイズの配列に格納する必要があります。私は現在、代入演算子をオーバーロードして、右側のlong long intより大きい数値を受け入れることが可能かどうか(ただし、内部的には整数を配列に格納するかどうか)疑問を抱いています。C++ BigIntegerと代入演算子オーバーロード

例:

のBigInteger I = 1000000000000000010000000000000000010000000000000000100000000000。

と内部的には次のように格納されるかもしれない:

i.data = {10000000000000000,100000000000000000,10000000000000000,100000000000}。

これは可能ですか?

#include "BigIntegerF.h" 
using namespace std; 

// Default Constructor 
BigIntegerF::BigIntegerF() { 
    data[0] = 0; 
} 

// Destructor 
BigIntegerF::~BigIntegerF(){} 

BigIntegerF& BigIntegerF::operator = (const BigIntegerF& bigInt) 
{ 
    // don't know how i could implement it here 
} 
+1

やり直してみましたか? 'operator ='のオーバーロードを知っていますか?はいの場合、直面している問題は何ですか? – UnholySheep

+1

注意:おそらく、代入演算子、コピーコンストラクタ、デストラクタなどをオーバーライドする必要はありません。これは、[ここで](http://en.cppreference.com/w/cpp/language/rule_of_three)で説明されている "ゼロのルール"とも呼ばれます。 – anatolyg

答えて

2

あなたはuser-defined literalsでこれを行うことができます:次のように

BigInteger operator ""_bigInt(char const *str, std::size_t len) { 
    // Create and return a BigInteger from the string representation 
} 

は、その後、あなたがBigIntegerを作成することができます。

auto myBigInt = 1234567890_bigInt; 
-1

C++はoperator ""を持っているこれは、私が来てどのくらいですこれらの場合の正確な構文は、コード内のリテラルからユーザー定義オブジェクトを作成したい場合です(answer by Quentin参照)。それを使用して

class BigInteger 
{ 
public: 
    ... 

    BigInteger(std::initializer_list<unsigned long long> list) 
    { 
     std::copy(list.begin(), list.end(), data); 
     size = list.size(); 
    } 

private: 
    ... 
    unsigned long long data[999]; 
    size_t size; 
}; 

:あなたのコンパイラは比較的新しいoperator ""構文(例えばMSのVisual Studio 2013およびそれ以前)をサポートしていない場合

、あなたは初期化子リストを伴うわずかに少ない便利な構文を使用することができます

BigInteger i{100000, 2358962, 2398572389, 2389562389}; 
+0

"コンパイラが比較的新しい演算子構文(例えばMS Visual Studio)をサポートしていない場合 - Visual Studio(少なくとも2015年と2017年)はユーザー定義リテラルをうまくサポートします。 –

+0

詳細を更新しました – anatolyg

関連する問題