【问题标题】:Overloading operator-, operator<, and operator > [closed]重载 operator-、operator< 和 operator > [关闭]
【发布时间】:2014-04-13 18:04:49
【问题描述】:

所以,我对运算符重载非常陌生,我无法获得 operator-、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

【问题讨论】:

  • 目前还不清楚这里有什么问题。如果你知道如何实现operator+,那么实现operator-的难点在哪里?
  • 我将首先将您的while 中的|| 更改为&amp;&amp;。如果这确实像我认为的那样,那么逻辑运算符是不正确的。
  • 我对如何修改 operator+ 为 operator- 感到困惑。从 operator+ 到 operator- 的修改很少吗?
  • @WhozCraig,这是我教授给我的代码的一部分。我认为这是正确的。
  • &lt; 运算符的问题似乎不在于实际的运算符函数,而在于您如何称呼它。您使用 iterator 而不是 BigInt 实例调用它。请记住,您必须使用解引用运算符 * 来获取迭代器“指向”的内容。

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


【解决方案1】:

if (rit1 &gt; rit2) 应该是 if (*rit1 &gt; *rit2),因为您想比较迭代器的内容而不是迭代器本身。

【讨论】:

  • 这解决了我最大的错误。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多