我正试图超载" +"对于类bigInt(使用linkedlist来保存long int)。我在函数中返回x1,x2的总和,如下所示。
&&
但是在main函数中,sum似乎没什么,即只是cout a + b =(其中shout总是没有输出和输出) 主要功能:
friend bigInt operator+(bigInt &x1,bigInt &x2){
bigInt sum;
int lenx1=x1.length();
int lenx2=x2.length();
int len_sum;
len_sum=lenx1>lenx2?lenx1:lenx2;
if(len_sum==lenx1){
for(int i=len_sum-1;i>=lenx2;--i){
sum.insert(0,x1.visit(i)->data);
}
for(int i=lenx2-1;i>=0;--i){
int add=x1.visit(i)->data+x2.visit(i)->data;
if(add>9){
sum.visit(i+1)->data+=1;
add-=10;
}
sum.insert(0,add);
}
}
else{
for(int i=len_sum-1;i>=lenx1;--i){
sum.insert(0,x2.visit(i)->data);
}
for(int i=lenx1-1;i>=0;--i){
int add=x1.visit(i)->data+x2.visit(i)->data;
if(add>9){
sum.visit(i+1)->data+=1;
add-=10;
}
sum.insert(0,add);
}
}
cout<<"sum="<<sum<<endl;//output is right here.
return sum;
}
我有超载&#34;&lt;&lt;&#34;和&#34;&gt;&gt;&#34;已经。但我不明白这里有什么不对。我会感激任何帮助。
感谢您的建议。我过载&#34; =&#34;现在。并且&#34; sum = b&#34;但是上面的错误似乎仍然存在:(
void main(){
bigInt a,b,sum;
cout<<"please input a big int a:"<<endl;
cin>>a;
cout<<"please input a big int b:"<<endl;
cin>>b;
sum=b+a;
cout<<a<<"+"<<b<<"="<<sum<<endl;
system("PAUSE");
}
答案 0 :(得分:0)
试着猜出可能出错的地方。如果您允许访问bigInt
类代码,则会更容易。
sum=b+a;
将使用赋值运算符(operator=
)。显然(从你发布和说过的内容),你没有超载它。因此编译器将使用默认实现复制对象属性(如果您的bigInt
类使用指针可能不安全,并且可能最终导致bigInt
结果为空......但很难确定,因为您没有发布bigInt
类代码)。
你应该重载operator=
(好的和最好的解决方案,see this),或者避免按照下面的建议使用它(你可能需要copy constructor,除非编译器足够智能通过执行return value optimization)来使用它:
int main(){
bigInt a,b;
cout<<"please input a big int a:"<<endl;
cin>>a;
cout<<"please input a big int b:"<<endl;
cin>>b;
bigInt sum(b+a); // assignment operator is not used anymore
cout<<a<<"+"<<b<<"="<<sum<<endl;
system("PAUSE");
}
请注意,定义自己的复制构造函数和赋值运算符是一种很好的做法,可以避免出现这种问题。 See this。如果所有类属性都是可复制的,则不要声明它们,如果它们不是(如原始指针)则不行。
答案 1 :(得分:-1)
确保重载复制构造函数和赋值运算符。
执行sum=a+b
时,赋值运算符应将临时和对象(右侧)的内容复制到sum(左侧)
如果没有重载赋值,编译器将执行一个&#34;浅拷贝&#34;,它会复制你班级的每个成员。将复制您在类中的任何指针,但不会移动基础数据。
这意味着您的主要和变量将指向您的函数副本数据。但是,该和目标是临时的,并在分配后删除,使您的主要金额不完整。
您的重载赋值运算符需要执行&#34;深拷贝&#34;,它通过将右侧链接列表中的值读入左侧的bigInt来重新创建bigInt