#关于运算符重载# 想先重载+=,再写+,结果两个都不会……求救(还是在练习写一个string类时遇到的。)
还是在写个string练习时遇到的,
请大家指教!
显然,目的是想连接两个c样式字符串。(pString是 mystring中私有成员:char* pString;)
先说+=
我这么写
mystring& mystring::operator+=(const mystring& aStr)
{
char* pTemp=new char [strlen(aStr.pString)+strlen(pString)];
pTemp=strcat(aStr.pString,pString);
strcpy(pString,pTemp);
delete[] pTemp;
return *this;
}
(s1,s2都是mystring类)
用s1+=s2;
cout<<endl<<s1.getStr();
调用不行,
Debug Error!
Program: ... Documents\Visual Studio Projects\ch141\ch141\Debug\ch141.exe
DAMAGE: after Normal block (#62) at 0x00370D10.
(Press Retry to debug the application)
我是cpp新手,思路混乱,一团矛盾,望指教。
--------------------------------------------
问题之二:
如果不从+=来写+,
直接写+
我用:
mystring& mystring::operator +(const mystring& aStr) const
{
return mystring(strcat(pString,aStr.pString));
}
构造函数如下
mystring::mystring(const char* pStr)
{
cout<<endl<<"Using Default Constructor.";
length=strlen(pStr);
pString= new char[length+1];
strcpy(pString,pStr);
}
结果出错
Access violation reading location 0xcccccccc.
没办法了,请教大家,谢!
问题点数:20、回复次数:8Top
1 楼Artex_xh(一团矛盾)回复于 2005-08-02 13:06:42 得分 0
自己先顶了,谢大家
Top
2 楼iamwindywolf(疾风之狼)回复于 2005-08-02 13:34:23 得分 10
第一个错误:
其实你没写错,你错的地方是内存泄露.在第一段程序里,
char* pTemp=new char [strlen(aStr.pString)+strlen(pString)];
pTemp=strcat(aStr.pString,pString);
这里你出了错,既然已经为pTemp分配了内存,那么在将它指向strcat产生的字符串就没意义了.原来指向的内存块就会发生丢失.所以你在delete的时候就会出现damage.
第二个错误,好象是因为你返回了一个临时对象的原因吧?看这一行:
return mystring(strcat(pString,aStr.pString));Top
3 楼boxban(冻酸梨)回复于 2005-08-02 13:37:46 得分 10
mystring& mystring::operator+=(const mystring& aStr)
{
int len1 = strlen(pString);
int len2 = strlen(aStr.pString) ;
char* pTemp=new char [len1 + len2 + 1]; //+1为'\0'留个座
memcpy(pTemp, pString, len1);
memcpy(pTemp+len1, aStr.pString, len2 + 1);
delete[] pString; //删除旧缓冲区
pString = pTemp;
return *this;
}
// operator + 不好返回引用
mystring mystring::operator +(const mystring& aStr) const
{
mystring tmp("");
//同前 +=
int len1 = strlen(pString);
int len2 = strlen(aStr.pString) ;
char* pTemp=new char [len1 + len2 + 1];
memcpy(pTemp, pString, len1);
memcpy(pTemp+len1, aStr.pString, len2 + 1);
tmp.pString = pTemp;
return tmp;
}
Top
4 楼boxban(冻酸梨)回复于 2005-08-02 13:38:43 得分 0
mystring mystring::operator +(const mystring& aStr) const
{
mystring tmp("");
//同前 +=
int len1 = strlen(pString);
int len2 = strlen(aStr.pString) ;
char* pTemp=new char [len1 + len2 + 1];
memcpy(pTemp, pString, len1);
memcpy(pTemp+len1, aStr.pString, len2 + 1);
delete []tmp.pString; //
tmp.pString = pTemp;
return tmp;
}
Top
5 楼Artex_xh(一团矛盾)回复于 2005-08-02 14:29:33 得分 0
谢二位
boxban(冻酸梨)的+好像不行啊?怎么打印不出来?
我用boxban(冻酸梨) 的+=,写+代码如下:
mystring mystring::operator +(const mystring& aStr) const
{
return mystring(*this)+=aStr;
}
副本构造函数如下:
mystring::mystring(mystring& pNewString)
{
cout<<endl<<"Using Copy Constructor.";
char* pStr=pNewString.getStr();
length=pNewString.length;
pString= new char[length+1];
for (int i=0;i<length;i++)
pString[i]= pStr[i];
pString[i]='\0';
}
结果返回值总是左操作数,
比如s1+s2,总打印出总是s1?
无奈,再讨教……Top
6 楼Artex_xh(一团矛盾)回复于 2005-08-02 14:30:50 得分 0
再谢boxban(冻酸梨)的+=Top
7 楼boxban(冻酸梨)回复于 2005-08-02 15:13:13 得分 0
在 += 实现返回前添加一句:length = len1 + len2;Top
8 楼Artex_xh(一团矛盾)回复于 2005-08-02 15:50:13 得分 0
嘿,真是的,我自己写的类,结果boxban(冻酸梨)比我还清楚……
谢了,我都忘了还有那个length
谢谢!Top




