【发布时间】:2014-04-13 18:04:49
【问题描述】:
所以,我对运算符重载非常陌生,我无法获得 operator-、operator> 和 operator 我的代码获得了 operator+ 代码,但我很难为 operator- 函数更改它。我的 operator 函数却没有,这基本上是一样的。 如果您能阐明如何执行此操作和/或提供链接以获得更多帮助,我们将不胜感激。 这是我目前所拥有的: (如您所见,我只是将 operator+ 复制并粘贴到我的 operator- 中以尝试推理) BigInt.cpp BigInt.h 我的 main.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;
}
#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
};
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中的||更改为&&。如果这确实像我认为的那样,那么逻辑运算符是不正确的。 -
我对如何修改 operator+ 为 operator- 感到困惑。从 operator+ 到 operator- 的修改很少吗?
-
@WhozCraig,这是我教授给我的代码的一部分。我认为这是正确的。
-
<运算符的问题似乎不在于实际的运算符函数,而在于您如何称呼它。您使用 iterator 而不是BigInt实例调用它。请记住,您必须使用解引用运算符*来获取迭代器“指向”的内容。
标签: c++ list stl operator-overloading biginteger