为什么我不能归还我的对象?

时间:2016-03-20 16:18:29

标签: c++

我正试图超载" +"对于类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");
}

2 个答案:

答案 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