2014-04-13 188 views
1

所以,我对操作符重载非常陌生,无法获取operator-,operator>和operator <的语法。重载operator-,operator <和operator>

我被授予了我的代码的操作符+代码,并且我很难将其更改为操作符函数。我也为我的运营商<函数获取了很多错误,但不是我的operator>函数,它基本相同。

如果你可以阐明如何做到这一点和/或为我提供更多帮助的链接,那将不胜感激。

这是我到目前为止有:

(正如你看到的,我只复制和粘贴操作+到我的操作符 - 尝试和理由吧)

BigInt.cpp

#include <iostream> 
#include <string> 
#include "BigInt.h" 

using namespace std; 

BigInt BigInt::operator+(BigInt operand) 
{ 
    int carry = 0; 
    int sum; 
    BigInt result; 
    list<int>::reverse_iterator rit1 = number.rbegin(); 
    list<int>::reverse_iterator rit2 = operand.number.rbegin(); 
    while ((rit1 != number.rend()) || (rit2 != operand.number.rend())) 
    { 
     sum = 0; 

     if (rit1 != number.rend()) 
     { 
      sum += *rit1; 
      rit1++; 
     } 

     if (rit2 != operand.number.rend()) 
     { 
      sum += *rit2; 
      rit2++; 
     } 

     sum += carry; 
     result.number.push_front(sum % 10); 
     carry = sum/10; 
    } 

    if (carry > 0) 
     result.number.push_front(carry); 

    return result; 
} 

void BigInt::display(ostream & out) 
{ 
    for (list<int>::iterator it = number.begin(); it != number.end(); it++) 
    { 
     cout << *it; 
    } 

    cout << endl; 
} 


void BigInt::read(istream & in) 
{ 
    string input; 

    cin >> input; 

    for (int i = 0; i < input.length(); ++i) 
    { 
      int x = input.at(i); 
      int y = char(x) - char('0'); 
      number.push_back(y); 
    } 



} 

bool BigInt::operator<(BigInt operand) 
{ 
    list<int>::reverse_iterator rit1 = number.rbegin(); 
    list<int>::reverse_iterator rit2 = operand.number.rbegin(); 
    int count1 = 0, count2 = 0; 
    bool check; 
    while ((rit1 != number.rend()) || (rit2 != operand.number.rend())) 
    { 
     if (rit1 > rit2) 
     { 
      count1++; 
      rit1++; 
      rit2++; 
     } 
     else if (rit2 > rit1) 
     { 
      count2++; 
      rit1++; 
      rit2++; 
     } 
     else 
     { 
      rit1++; 
      rit2++; 
     } 

    } 
    if(count1 < count2) 
    { 
     check = true; 
    } 
    else 
    { 
     check = false; 
    } 

    return check; 
} 

bool BigInt::operator>(BigInt operand) 
{ 
    list<int>::reverse_iterator rit1 = number.rbegin(); 
    list<int>::reverse_iterator rit2 = operand.number.rbegin(); 
    int count1 = 0, count2 = 0; 
    while ((rit1 != number.rend()) || (rit2 != operand.number.rend())) 
    { 
     if (rit1 > rit2) 
     { 
      count1++; 
      rit1++; 
      rit2++; 
     } 
     else if (rit2 > rit1) 
     { 
      count2++; 
      rit1++; 
      rit2++; 
     } 
     else 
     { 
      rit1++; 
      rit2++; 
     } 

    } 
    if(count1 > count2) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 


} 

bool BigInt::operator==(BigInt operand) 
{ 
    list<int>::reverse_iterator rit1 = number.rbegin(); 
    list<int>::reverse_iterator rit2 = operand.number.rbegin(); 


    do 
    { 
     rit1++; 
     rit2++; 
    } 
    while(rit1 == rit2); 

    return false; 

} 

BigInt BigInt::operator-(BigInt operand) 
{ 
    int carry = 0; 
    int sum; 
    BigInt result; 
    list<int>::reverse_iterator rit1 = number.rbegin(); 
    list<int>::reverse_iterator rit2 = operand.number.rbegin(); 
    while ((rit1 != number.rend()) || (rit2 != operand.number.rend())) 
    { 
     sum = 0; 

     if (rit1 != number.rend()) 
     { 
      sum += *rit1; 
      rit1++; 
     } 

     if (rit2 != operand.number.rend()) 
     { 
      sum += *rit2; 
      rit2++; 
     } 

     sum += carry; 
     result.number.push_front(sum % 10); 
     carry = sum/10; 
    } 

    if (carry > 0) 
     result.number.push_front(carry); 

    return result; 
} 

BigInt.h

#include <list> 
using namespace std; 

class BigInt 
{ 
public: 
BigInt() {}; 
void read(istream & in); 
void display(ostream & out); 
BigInt operator+(BigInt operand); //overloading operator 
BigInt operator-(BigInt operand); //subtraction 
bool operator<(BigInt operand); 
bool operator>(BigInt operand); 
bool operator==(BigInt operand); 
list<int> number; //using STL list 
}; 

我没有在我的main.cpp呢。

希望你能帮助我!谢谢!

编辑!!!:

忘记列出我的错误,我的操作<功能:

Error 10 error C2676: binary '<' : 'std::_List_iterator<_Mylist>' does not define this operator or a conversion to a type acceptable to the predefined operator c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility 1014 
Error 4 error C2784: 'bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'const _Elem *' from 'std::_List_iterator<_Mylist>' c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility 1014 
Error 8 error C2784: 'bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : could not deduce template argument for 'const std::_Revranit<_RanIt,_Base> &' from 'std::_List_iterator<_Mylist>' c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility 1014 
Error 3 error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'std::_List_iterator<_Mylist>' c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility 1014 
Error 5 error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'std::_List_iterator<_Mylist>' c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility 1014 
Error 2 error C2784: 'bool std::operator <(const std::list<_Ty,_Alloc> &,const std::list<_Ty,_Alloc> &)' : could not deduce template argument for 'const std::list<_Ty,_Alloc> &' from 'std::_List_iterator<_Mylist>' c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility 1014 
Error 6 error C2784: 'bool std::operator <(const std::move_iterator<_RanIt> &,const std::move_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::move_iterator<_RanIt> &' from 'std::_List_iterator<_Mylist>' c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility 1014 
Error 9 error C2784: 'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : could not deduce template argument for 'const std::pair<_Ty1,_Ty2> &' from 'std::_List_iterator<_Mylist>' c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility 1014 
Error 7 error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'std::_List_iterator<_Mylist>' c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility 1014 
+1

目前尚不清楚问题出在哪里。如果你知道如何实现'operator +',那么实现'operator-'的难度是多少? –

+0

我会从''while'开始将'||'改为'&&'。如果这符合我的想法,那么逻辑运算符在写入时就不正确。 – WhozCraig

+0

我很困惑如何修改操作员+操作员。运营商和运营商之间是否有很少的修改? – Midge

回答

2

if (rit1 > rit2)if (*rit1 > *rit2),你要比较的迭代器不是迭代器自理的内容。

+0

这解决了我最大的错误。谢谢。 – Midge