我试图在我自己的C styled
版本的string
类上重载+
操作符。
一切都很好,除了display()
调用第二个字符串s2
显示垃圾值。
class string_ {
char *str;
int len;
public :
...
void display()
{
cout << str;
}
};
string_ :: string_()
{
str = 0;
len = 0;
}
string_ :: ~string_()
{
delete []str;
len = 0;
}
string_ :: string_(char *s,int l)
{
len = l + 1; // +1 for
str = new char[len];
int i;
for(i=0;i<len;i++)
str[i] = s[i];
str[i] = ' ';
}
string_ string_ :: operator +(string_ c)
{
int j = 0, i = 0;
string_ s;
s.len = len + c.len - 1;
s.str = new char[s.len];
while (str[i] != ' ')
{s.str[i] = str[i]; i++;}
while (c.str[j] != ' ')
{s.str[i] = c.str[j]; i++; j++; }
s.str[i] = ' ';
//The below statements gives the desired output
cout <<"nIN operator +" << str;
cout <<"nIN operator +" << c.str;
cout <<"nIN operator +" << s.str;
return s;
}
int main()
{
char *str = "Hello";
char *str1 = " World";
string_ s1(str,5);
string_ s2(str1,6);
string_ s3 = s1 + s2;
cout << "nstring s1 : ";
s1.display();
cout << "nstring s2 : ";
s2.display(); //PROBLEM
cout << "nConcatenated string : ";
s3.display();
return 0;
}
您缺少一个适当的复制构造函数,用于将字符数组从一个字符串克隆到另一个字符串。
你的operator+
也应该把const-ref
带到你的字符串类,因为这里不需要复制。
string_ string_ :: operator +(const string_& c)
第一个对象有一个指向字符数组的指针,例如str=0x1
。因为没有复制构造函数,所以指针值会自动复制到字符串的副本。两个字符串现在有相同的指针。第一个字符串删除数组,第二个字符串将失败。看看规则三,它描述了应该实现哪些函数来避免这个问题。编辑:R Sahu在评论中更快。
注:因为您使用的是const-literals,所以请将char*
更改为const char*
。
P.S.2请下次发个MVCE