簡體   English   中英

重載<<操作符意外行為?

[英]Overloading << operator unexpected behaviour?

我在為我的項目編寫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;
}

期望的結果是在main()兩種cout語句的情況下都打印結果,例如:

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

但是第一條語句給出了錯誤,指出no match for operator<<

缺少什么才能獲得理想的結果?

t + u這種回報不能綁定到左值引用臨時要求由operator<<(ostream &out, BigInteger &t)你需要添加const

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

無論如何,這應該是流運算符的默認值,因為您不希望更改此對象的狀態。

您的輸出運算符應采用const引用:

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

您不能對t+u使用非常量引用,因為它是一個r值,但是您可以將const-ref綁定到一個r值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM