2017-05-30 15 views
-1

私のように私のプロジェクトのためのBigInteger算術のを書いていた:<<演算子の予期しない動作がオーバーロードされていますか?

.HPPファイル:

#include<iostream> 
    #include<vector> 
    #include<string> 
    #include<algorithm> 

    using namespace std; 

    class BigInteger{ 
    private: 
     vector<int> digits; 
    public: 
     BigInteger(){} 
     BigInteger(string input); 
     BigInteger(int input); 
     friend BigInteger operator+(BigInteger &lhs, BigInteger &rhs); 
     BigInteger operator=(BigInteger &rhs); 
     friend ostream &operator<<(ostream &out, BigInteger &t); 
     vector<int> getDigits(); 
     int getNum(int t); 
     void setDigits(vector<int> &vect); 
     void handleCarry(BigInteger &t); 
    }; 

.cppファイル:

#include "BigInteger.hpp" 

BigInteger::BigInteger(string input){ 
int temp;· 
for(int i = input.size()-1; i >= 0; i--){ 
    temp = input[i] - '0'; 
    digits.push_back(temp); 
} 
} 

BigInteger::BigInteger(int input){ 
    int temp = input; 
    while(temp){ 
    digits.push_back(temp%10); 
    temp = temp/10; 
    } 
} 

vector<int> BigInteger::getDigits(){ 
return digits; 
} 

void BigInteger::setDigits(vector<int> &vect){ 
    digits = vect; 
} 

void BigInteger::handleCarry(BigInteger &t){ 
    vector<int> temp = t.getDigits(); 
    int len = temp.size(); 

    int num = 0; 

    for(int i = 0; i < len; i++){ 
    carry = temp[i]/10; 
    num = temp[i]%10; 
    temp[i] = num; 

    if((len -1) == i && carry > 0){ 
     temp.push_back(carry); 
    } 
    else 
     temp[i+1] += carry; 
    } 
    t.setDigits(temp); 
} 

BigInteger operator+(BigInteger &lhs, BigInteger &rhs){ 
    int len = lhs.getDigits().size() > rhs.getDigits().size()? lhs.getDigits().size():rhs.getDigits().size(); 
    BigInteger result; 
    vector<int> tmp; 
    for(int i = 0; i < len; i++){ 
     tmp.push_back(lhs.getNum(i) + rhs.getNum(i)); 
    } 
    result.setDigits(tmp); 
    result.handleCarry(result); 
    return result; 
} 

BigInteger BigInteger::operator=(BigInteger &rhs){ 
    vector<int> temp(rhs.getDigits()); 
    this->setDigits(temp); 
    return *this; 
} 
ostream &operator<<(ostream &out, BigInteger &t){ 
    for(int i = t.getDigits().size()- 1; i >= 0; i--){ 
    out << t.getDigits()[i]; 
    } 
cout << endl; 
    return out; 
} 

MAIN.CPP:

#include "BigInteger.hpp" 

int main(){ 
BigInteger t("123"); 
BigInteger u(234); 
BigInteger r = t + u; 
cout << r << endl; 
cout << t + u << endl; 

return 0; 
} 

所望の結果は、両方の場合に結果を印刷することであった。cout以下のようなmain()での声明:

cout << t + u << endl; 
or 
r = t + u; 
cout << r << endl; 

しかし、最初の文はno match for operator<<を言って、エラーを与えています。

希望の結果を得るために欠けているものはありますか?

+1

あなたの質問を[編集]して[mcve]を提供してください。 –

+2

あなたの 'operator +'は 't + u'の結果から一時的に作成されます。そして' BigInteger 'として 'operator <<'に渡そうとします。一時的ではないconst参照にバインドすることはできません。 – CoryKramer

+0

正確なエラーメッセージを投稿してください。また、ポストされた例が最小である場合に役立ちます。 [mcve] – AndyG

答えて

3

t + uこれはoperator<<(ostream &out, BigInteger &t)によりを求めた左辺値参照にバインドすることはできません、あなたはconstを追加する必要があることを一時的に返します。

ostream &operator<<(ostream &out, const BigInteger &t) 

これがとにかくストリーム演算子のデフォルトである必要があり、あなたは「shouldnので、このオブジェクトの状態を変更したくありません。

+0

この回答に追加するだけです。あなたがする必要がない限り、あなたは常に 'const'を作るべきです。 – cppxor2arr

1

あなたの出力オペレータはconst参照取る必要があります。

ostream &operator<<(ostream &out,const BigInteger &t) 
            ^^ 

を、それはr値であるので、あなたは、t+uへの非const参照を取るカントが、あなたは、rへのconst-REFをバインドすることができます-値。

関連する問題