大家看看我这个大数相乘有什么问题,主要是函数返回处有问题。

kei_lin 2009-08-05 07:08:23

#pragma once
#include <iostream>
using namespace std;
class BigNum1
{
public:
BigNum1(void);
~BigNum1();
BigNum1(int *, int);
BigNum1(BigNum1&);
BigNum1& operator=(BigNum1 BigOne);
BigNum1& operator*(BigNum1 &bigOne);
BigNum1& operator+(BigNum1 &bigOne);
friend ostream& operator<<(ostream &os, BigNum1 &BigOne);
private:
long nlen;
int *pData;
};


BigNum1::BigNum1(void)
{
nlen = 0;
pData = NULL;
}

BigNum1::~BigNum1(void)
{
if (nlen != 0)
{
nlen = 0;
delete[] pData;
pData = NULL;
}
}

BigNum1::BigNum1(int *data, int len)
{
nlen = len;
pData = new int[nlen];
memcpy(pData, data, 4 * len);
}

BigNum1::BigNum1(BigNum1& BigOne)
{
if (this == &BigOne )
{
return;
}
nlen = BigOne.nlen;
if (pData)
{
delete[] pData;
pData = NULL;
}
pData = new int[nlen];
memcpy(pData, BigOne.pData, nlen * 4);
}

BigNum1& BigNum1::operator=(BigNum1 bigOne)
{
if (this == &bigOne)
{
return *this;
}

if (pData)
{
delete [] pData;
pData = NULL;
}
nlen = bigOne.nlen;
pData = new int[nlen];
for (int i = 0; i < nlen; i++)
{
pData[i] = bigOne.pData[i];
}
return (*this);
}

BigNum1& BigNum1::operator+(BigNum1 &bigOne)
{
long Maxlen = nlen > bigOne.nlen?nlen + 1: bigOne.nlen + 1;
BigNum1 bigSum;
bigSum.nlen = Maxlen;
bigSum.pData = new int[Maxlen];
memset(bigSum.pData, 0, 4 * Maxlen);
int k = 0;
for (int i = 0 ; i < Maxlen; i++)
{
int a, b;
a = 0;
b = 0;
if (i < nlen)
{
a = pData[i];
}
if (i < bigOne.nlen)
{
b = bigOne.pData[i];
}
int sum = a+ b + k;
k = sum / 10;
bigSum.pData[i] = sum %10;
}
return bigSum;
}

BigNum1& BigNum1::operator*(BigNum1& bigOne)
{
BigNum1 IData;
long maxLen = nlen + bigOne.nlen;
IData.nlen = maxLen;
IData.pData = new int[maxLen];
memset(IData.pData, 0, IData.nlen * 4);
for (int i = 0; i < nlen; i++)
{
BigNum1 Jdata;
Jdata.nlen = maxLen;
Jdata.pData = new int[maxLen];
memset(Jdata.pData, 0, Jdata.nlen * 4);
int a = 0;
int b = 0;
for (int j = 0; j < bigOne.nlen; j++)
{
int sum = pData[i] * bigOne.pData[j];
sum += a;
a = sum/ 10;
b = sum % 10;
Jdata.pData[i+j] = b;
}
/* if (a != 0)
{
Jdata.pData[i + bigOne.nlen] = a;
}*/
IData = IData + Jdata;
}
cout<<IData;
return IData;
}

ostream& operator<<(ostream& os, BigNum1 &bigOne)
{
for ( int i = bigOne.nlen - 1; i >= 0; i--)
{
os<<bigOne.pData[i];
}
return os;
}

#include "stdafx.h"
#include "BigNum1.h"

int _tmain(int argc, _TCHAR* argv[])
{
int np[] = {1,1};
int nq[] = {2,1};
//BigNum1 one(np, 2);
BigNum1 two(nq, 2);
two = two * two;
cout<<two<<endl;
return 0;
}
多谢了。
...全文
110 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
billow_zhang 2009-08-06
  • 打赏
  • 举报
回复
BigNum1& BigNum1::operator=(BigNum1 bigOne)
应该改为:
BigNum1& BigNum1::operator=(const BigNum1& bigOne)

BigNum1& BigNum1::operator*(BigNum1& bigOne)
BigNum1& BigNum1::operator+(BigNum1& bigOne)

中返回了局部变量的引用,将会出错,应将函数声明分别改为:
BigNum1 BigNum1::operator*(const BigNum1& bigOne);
BigNum1 BigNum1::operator+(const BigNum1& bigOne);

只要这样改一些就行了,不要使用new, 也不要使用static。这个问题在more effecive c++中有专门的论述。

其他方面没有仔细看。不过,上面两个问题可都是c++的基本概念和使用问题。楼主看来还需要加强学习。
比如上面,该使用const修饰的地方都没有使用,改使用引用的地方也没有使用。还有:
BigNum1(const BigNum1&);
friend ostream& operator<<(ostream &os, const BigNum1 &BigOne);
billow_zhang 2009-08-06
  • 打赏
  • 举报
回复
BigNum1& BigNum1::operator*(BigNum1& bigOne)
BigNum1& BigNum1::operator+(BigNum1& bigOne)

这个当然不行,我不是上面已经说过,要修改为:

BigNum1 BigNum1::operator*(const BigNum1& bigOne);
BigNum1 BigNum1::operator+(const BigNum1& bigOne);

这个问题,不需要再考虑了,没有更好的方法了. 在more effective c++的书里已经全面的论证了这个问题.
kei_lin 2009-08-06
  • 打赏
  • 举报
回复
BigNum1& BigNum1::operator=(BigNum1 bigOne)
应该改为:
BigNum1& BigNum1::operator=(const BigNum1& bigOne)

BigNum1& BigNum1::operator*(BigNum1& bigOne)
BigNum1& BigNum1::operator+(BigNum1& bigOne)
我试过了,这样不行的。
我想是BigNum1.pdata 这个分配内存在返回时出错。
不过我现在也想不出用什么好的代替。
如果把最后的结果放在this中应该可以,但这样破坏了重载的规则。
cyxcw1 2009-08-06
  • 打赏
  • 举报
回复
LZ用下复合操作重载*=可以吗?
直接返回一个THIS!呵呵
sonicrang 2009-08-05
  • 打赏
  • 举报
回复
new完了要delete的
LeonTown 2009-08-05
  • 打赏
  • 举报
回复
那就static
xia0cainia0 2009-08-05
  • 打赏
  • 举报
回复
将函数内部new出来的指针作为返回值,没有delete[],有内存泄露的风险。
LeonTown 2009-08-05
  • 打赏
  • 举报
回复
另外,
operator*里面,
应该是Jdata.pData[i+j] += b;吧
LeonTown 2009-08-05
  • 打赏
  • 举报
回复
operator +和*,返回的是局部变量。
在函数外引用会出错。
改成new试试

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧