[英]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.