重载算符 问题?求帮助,急急急急

xu_小兵 2010-12-24 08:17:58
重载+和=号,=重载都实现了,还有一个bug就是有一个new之后释放不掉,求高手帮助,调试了好长时间了!
#include<iostream>
using namespace std;

class mystring
{
public:
mystring();
mystring(char *a);
mystring(mystring &s);

~mystring();
char * strcopy(char *stra);
mystring & operator =(mystring &st);
mystring operator+(mystring &st);
int strlength();
int strch(mystring a);
void showopr();
public:
int length;
char *str1;

};

mystring::mystring()
{
cout<<"constract mysring"<<endl;
length=0;
str1=new char[1];

}

mystring::mystring(char *a)
{
char *ww=a;
cout<<"construct mystring 2"<<endl;
int n=0;
while (*(ww++) != '\0')
{
n++;

}
length=n;
str1 =new char[length+1];
strcopy(a);

}

mystring::mystring(mystring &s)
{
if(s.str1)
{
cout<<"constrct3"<<endl;
length=s.length;
str1=new char[length+1];
strcopy(s.str1);
}
else
{
cout<<"error";
}

}
mystring::~mystring()
{
cout<<"deleteing"<<endl;
delete []str1;
cout<<"deleteing str1"<<endl;


}

mystring & mystring::operator=(mystring &st)
{
if(str1)
{
delete []str1;
}
length=st.length;
str1=new char[length+1];
str1=strcopy(st.str1);
cout<<"------"<<str1<<"-----"<<endl;
return *this;
}

mystring mystring:: operator+(mystring &st)
{
int i;
mystring aa;
aa.length=st.length+length;
aa.str1=new char[aa.length+1];
for( i=0;i<aa.length;i++)
{
if(*str1!='\0')
{
*(aa.str1+i)=*(str1++);
}
else
{
*(aa.str1+i)=*(st.str1++);
}

}
*(aa.str1+i)='\0';
cout<<"======"<<aa.str1<<"======="<<endl;
return aa;

}
//实现strcopy等函数不在调用string类情况下,实现

char * mystring::strcopy(char *stra)
{
char *stt=stra;
char *address=str1;
if ((stra == NULL) || (str1 == NULL))
{
cout<<"字符串错误";
}

while ((*address++ = *stt++) != '\0')
;
return str1;
}

//求字符串长度
int mystring::strlength()
{
int ss=0;
char *strb=str1;
if (*strb==NULL)
{
cout<<"error!"<<endl;

}
while ((*strb++) != '\0')
{
ss++;

}
return ss;
}

//求子串,这自己编写的,还可以参考数据结构的那个,思想一样
int mystring::strch(mystring a)
{
int i,j;
char *ss=a.str1;
char *gg=this->str1;
char *ii=this->str1;//增加两个指针,都是指向主串的位置,

for(i=0;i<=(this->length - a.length);gg=++ii,++i)
{
for(j=0,ss=a.str1;j<a.length;j++)
{
if(*gg==*ss)
{
gg++;
ss++;
}
else
{
break;
}

}
if(j==a.length)
{
return i+1;
}

}
return -1;
}

void mystring::showopr()
{
cout<<str1<<endl;
}
int main()
{

char aa[100];
char ee[100];
cout<<"请输入字符串:"<<endl;
cin>>aa;
mystring str(aa),ss;
ss=str;
ss.showopr();
cout<<"请第二个输入字符串:"<<endl;
cin>>ee;
mystring str2(ee),s1;

s1=str2+str;
s1.showopr();
return 0;
}
...全文
143 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xu_小兵 2010-12-24
  • 打赏
  • 举报
回复
自己写的自定义不用那个的![Quote=引用 3 楼 lirg8405 的回复:]
strcopy(a);
我印象中两个参数的吧??????????
[/Quote]
xu_小兵 2010-12-24
  • 打赏
  • 举报
回复
晕,要求就是用自己写的,不然我没事写那个做啥!还是谢谢你的回答!
[Quote=引用 8 楼 gules 的回复:]
求char*型字符串长度及拷贝的函数没必要自己写,可以使用C库的strlen及strcpy;
在类的实现方面,尽可能使用const,包括参数传递、函数属性及返回值类型等;
最重要的就是实现=操作符时,一定要考虑到自我赋值的正确性问题。
[/Quote]
xu_小兵 2010-12-24
  • 打赏
  • 举报
回复
谢谢,我发现了,在这种地方载了好几次了!
[Quote=引用 7 楼 zhapin123 的回复:]
改一改我注释的三个地方就没问题了

C/C++ code
mystring mystring:: operator+(mystring &st)
{
int i;
mystring aa;
char *tempthis=str1,*tempst=st.str1;//改动的地方
aa.length=st.length+length;
……
[/Quote]
gules 2010-12-24
  • 打赏
  • 举报
回复
求char*型字符串长度及拷贝的函数没必要自己写,可以使用C库的strlen及strcpy;
在类的实现方面,尽可能使用const,包括参数传递、函数属性及返回值类型等;
最重要的就是实现=操作符时,一定要考虑到自我赋值的正确性问题。
zhapin123 2010-12-24
  • 打赏
  • 举报
回复
改一改我注释的三个地方就没问题了
mystring mystring:: operator+(mystring &st)
{
int i;
mystring aa;
char *tempthis=str1,*tempst=st.str1;//改动的地方
aa.length=st.length+length;
aa.str1=new char[aa.length+1];
for( i=0;i<aa.length;i++)
{
if(*str1!='\0')
{
*(aa.str1+i)=*(tempthis++);//改动的地方
}
else
{
*(aa.str1+i)=*(tempst++);//改动的地方
}

}
*(aa.str1+i)='\0';
cout<<"======"<<aa.str1<<"======="<<endl;
return aa;

}
we_sky2008 2010-12-24
  • 打赏
  • 举报
回复

mystring & mystring::operator=(const mystring &st)
{
if (this != &st)
{
delete []str1;

str1 = new char[st.length + 1];
strcopy(st.str1);
}
cout<<"------"<<str1<<"-----"<<endl;

return *this;
}


mystring mystring:: operator+(const mystring &st)
{
char *tmp = new char[st.length + length + 1];
strcpy(tmp, str1);
strcpy(tmp + length, st.str1);

cout<<"======"<<tmp<<"======="<<endl;

return mystring(tmp);
}

we_sky2008 2010-12-24
  • 打赏
  • 举报
回复

mystring::mystring()
{
cout<<"constract mysring"<<endl;
length=0;
str1=new char[1];
*str1 = 0;//这里
}

mystring::mystring(char *a)//这里应该是const char *a;
{
char *ww=a;//所以这里也应该是const char *ww = a;
cout<<"construct mystring 2"<<endl;
int n=0;
while (*(ww++) != '\0')
{
n++;

}
length=n;
str1 =new char[length+1];
strcopy(a);

}


mystring::mystring(mystring &s)//这里最好改为const mystring &s;
{
if(s.str1)//这里的判断就没有必要了,
{
cout<<"constrct3"<<endl;
length=s.length;
str1=new char[length+1];
strcopy(s.str1);
}
else
{
cout<<"error";
}

}


mystring & mystring::operator=(mystring &st)//这里最好是const mystring &st
{
//应该加上if (this == &s)的判断
if(str1)//同样这里的判断也没必要,
{
delete []str1;
}
length=st.length;
str1=new char[length+1];
str1=strcopy(st.str1);
cout<<"------"<<str1<<"-----"<<endl;
return *this;
}


mystring mystring:: operator+(mystring &st)//const mystring &st
{
int i;
mystring aa;//其实这里没必要创建一个这样的缺省对象的
aa.length=st.length+length;
aa.str1=new char[aa.length+1];//这里就泄露了啊,str1没有释放
for( i=0;i<aa.length;i++)
{
if(*str1!='\0')
{
*(aa.str1+i)=*(str1++);
}
else
{
*(aa.str1+i)=*(st.str1++);
}

}
*(aa.str1+i)='\0';
cout<<"======"<<aa.str1<<"======="<<endl;
return aa;

}


luciferisnotsatan 2010-12-24
  • 打赏
  • 举报
回复
mystring & mystring::operator=(mystring &st)
先要判断下是不是自己付给自己

if(this == &st)
return this;
lirg8405 2010-12-24
  • 打赏
  • 举报
回复
strcopy(a);
我印象中两个参数的吧??????????
we_sky2008 2010-12-24
  • 打赏
  • 举报
回复
其实楼主写的代码小问题挺多的
qq120848369 2010-12-24
  • 打赏
  • 举报
回复
我怎么没看见你new,也没见到delete.

64,636

社区成员

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

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