c++运算符重载问题,调试出错
vc编译没问题,但在运行时出现:
file :degheap.c
line:1044
Expression:CrtIsValidHeapPointer(pUserDate)
我的程序是这样的:
void main(int argc, char* argv[])
{
MyInt iM("1234567890123"); // 整数对象初始化
MyInt iN("3210987654321");
MyInt iResult1;
iResult1 =iN;
iResult1.Display();
}
这了做一个可以计算任意整数加减法的类:
我觉得是等号的原因。
我的类:
#include <iostream.h>
class MyInt
{
char* Integer;
bool Negative;
public:
MyInt();
MyInt(char* s);
~MyInt();
const MyInt operator=(const MyInt&){return *this;};
friend const MyInt operator+(const MyInt& left,const MyInt& right);
void Display(){cout<<Integer<<endl;}
};
MyInt::MyInt()
{
// Integer=NULL;
Negative=false;
}
MyInt::MyInt(char* s)
{
int i=strlen(s),j=0,t=0;
Negative=false;
if(s[0]=='-'||s[0]=='+')//判断s的符号问题,如果是负号就存,其他情况不存
{
t=1;
if(s[0]=='-')
{
Negative=true;
Integer=new char[i-1];
}
else {Integer=new char[i-1];}
}
else Integer=new char[i];
i--;
while (i>=t)
{
if (s[i]>'9'||s[i]<'0')
{
cout<<"set error"<<endl;
i=-1;
}
else {Integer[j] = s[i];--i; ++j;}//将s存进Integer,并让s的个位位于Integer[0],这是为了方便以后的计算
}
}
MyInt::~MyInt()
{
delete []Integer;
}
麻烦帮帮忙
问题点数:40、回复次数:9Top
1 楼zunyilbj(子木邦)回复于 2005-04-03 13:42:39 得分 0
哪位牛人帮帮忙Top
2 楼szws(克米帅)回复于 2005-04-03 15:14:37 得分 20
就你给出的东西来看,问题来这里:
构造函数中:
没有给Integer赋初值
// Integer=NULL;
但在析构函数中
delete []Integer;
所以,我测试了下;
void main()
{
MyInt iResult1;
}
就出错了!
其他还没看!
Top
3 楼szws(克米帅)回复于 2005-04-03 15:49:16 得分 15
是等号的原因;
你重载错了
MyInt & operator=( MyInt & s)
{
Integer=new char[strlen(s.Integer)+1];
strcpy(Integer,s.Integer);
return *this;
}
另外,你的构造函数好象也有点问题;
输出的时候有乱码
如:
1234567890123葺葺葺軦
Integer=i+1(也就是:strlen(s)+1就对了)
class MyInt
{
char* Integer;
bool Negative;
public:
MyInt();
MyInt(char* s);
~MyInt();
MyInt & operator=( MyInt & s)
{
Integer=new char[strlen(s.Integer)+1];
strcpy(Integer,s.Integer);
return *this;
}
void copy(char *s)
{
Integer=new char[strlen(s)+1];
strcpy(Integer,s);
}
friend const MyInt operator+(const MyInt& left,const MyInt& right);
void Display(){cout<<Integer<<endl;}
};
MyInt::MyInt()
{
Integer=NULL;
Negative=false;
}
MyInt::MyInt(char* s)
{
int i=strlen(s),j=0,t=0;
Negative=false;
if(s[0]=='-'||s[0]=='+')//判断s的符号问题,如果是负号就存,其他情况不存
{
t=1;
if(s[0]=='-')
{
Negative=true;
Integer=new char[i];//////// 改了
}
else {Integer=new char[i];}///////// 改了
}
else Integer=new char[i+1]; ///////// 改了
i--;
while (i>=t)
{
if (s[i]>'9'||s[i]<'0')
{
cout<<"set error"<<endl;
i=-1;
}
else {Integer[j] = s[i];--i; ++j;}//将s存进Integer,并让s的个位位于Integer[0],这是为了方便以后的计算
}
Integer[j]='\0'; //改了,加个回车
}
MyInt::~MyInt()
{
delete []Integer;
}
int main()
{
MyInt iM("1234567890123"); // 整数对象初始化
MyInt iN("3210987654321");
MyInt iResult1;
iResult1 =iN;
iResult1.Display();
return 0;
}
Top
4 楼yu2680020(劳心者治人,劳力者治与人,左手马哲,右手政经,编程三个代表去编程!唉,结果,干得好不如嫁得好-就是!)回复于 2005-04-03 15:52:42 得分 0
同意楼上的Top
5 楼goodluckyxl(被人遗忘的狗)回复于 2005-04-04 09:41:41 得分 5
肯定是指针的所有权分配混乱造成的
Top
6 楼zunyilbj(子木邦)回复于 2005-04-04 12:48:18 得分 0
szws(克米帅):我是不是把析构函数写错了?把指针分配错了。Top
7 楼szws(克米帅)回复于 2005-04-04 15:06:11 得分 0
你的‘=’重载错了。
构造函数里为什么把下面这句注释掉??
// Integer=NULL;
析构函数里却
delete []Integer;
当然会出错!
Top
8 楼zhousqy(标准C匪徒)(甩拉,甩拉)回复于 2005-04-04 15:15:03 得分 0
markTop
9 楼MagicCarmack(MagiC++)回复于 2005-04-04 16:53:57 得分 0
mark
Top




