我试图在我+
类的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 \0
str = new char[len];
int i;
for(i=0;i<len;i++)
str[i] = s[i];
str[i] = '\0';
}
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] != '\0')
{s.str[i] = str[i]; i++;}
while (c.str[j] != '\0')
{s.str[i] = c.str[j]; i++; j++; }
s.str[i] = '\0';
//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;
}
答案 0 :(得分:4)
您缺少一个正确的复制构造函数,您可以将char数组从一个字符串克隆到另一个字符串。
此外,您的operator+
应该将const-ref
带到您的字符串类,因为此处不需要副本。
string_ string_ :: operator +(const string_& c)
问题
你的第一个对象有一个指向char数组的指针,例如str=0x1
。因为没有复制构造函数,所以指针值会自动复制到字符串的副本中。两个字符串现在具有相同的指针。第一个字符串删除数组,第二个字符串失败。查看Rule of three,其中描述了应该实现哪些功能以避免此问题。 编辑:R Sahu在评论中更快。
P.S。由于您使用const-literals将char*
更改为const char*
。
P.S.2请在下次发布MVCE。