重载operator-,operator<和operator>

时间:2014-04-13 18:04:49

标签: c++ list stl operator-overloading biginteger

所以,我对操作符重载很新,我无法获得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中什么都没有。

希望你能帮助我!谢谢!

EDIT !!!:

我忘了为我的运营商列出我的错误&lt;功能:

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

答案 0 :(得分:2)

if (rit1 > rit2)应该是if (*rit1 > *rit2),因为你想要比较迭代器的内容而不是它们自己的迭代器。