我自己写字符串类。而且我重载了+运算符。它的工作正常,但后来我尝试了cstr = str +pop
,它没有做任何事情。 `你可以在main()函数中看到我的错误。 Complier不会给出任何错误。
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
class S {
public:
S();
S(const char *str);
S(const S &s);
~S() { delete []string;}
S &operator =(const S &s);
int lenght() const {return l ;}
char* strS() const {return string;}
friend ostream &operator <<(ostream &, const S &first) {cout<<first.string;}
friend S operator+ (const S& first, const S& second);
private:
char *string;
int l;
};
int main(){
S pop("Q6");
S str("M5");
S cstr = str +pop; // works correct
cout<<str;
str = str + pop;
cout<<str ; // doesnt work, it doesnt write in terminal
return 0;
}
S::S()
{
l = 0;
string = new char[1];
string[0]='\0';
}
S::S(const char *str)
{
l = strlen(str);
string = new char[l+1];
memcpy(string, str, l+1);
}
S::S(const S &s)
{
l = s.l;
string = new char[l+1];
memcpy(string,s.string,l+1);
}
S &S::operator=(const S &s)
{
if (this != &s)
{
delete []string;
string = new char[s.l+1];
memcpy(string,s.string,s.l+1);
return *this;
}
return *this;
}
S operator +(const S& first, const S& second)
{
S temp;
temp.string = strcat(first.strS(),second.strS());
temp.l = first.lenght() + second.lenght();
return temp;
}
我期待着你的帮助。
答案 0 :(得分:3)
您的运营商有错误!
S temp;
//^^^^ has only one byte buffer!!!
temp.string = strcat(first.strS(),second.strS());
// 1 byte ^^^^^ strcat appends second.strS to first.strS
你应该为temp重新分配内存:
S temp;
temp.l = first.lenght() + second.lenght();
delete [] temp.string; // !!!! -
temp.string = new char[temp.l + 1]; // !!!!
// you should have another c-tor which can allocate memory!!!
// like: S(unsigned length, unsigned char c = '\0')
strcpy(temp.string, first.strS());
strcat(temp.string, second.strS());
除了这个明显的错误之外 - 你还应该处理异常 - 例如std::bad_alloc
。查看复制和交换习惯用法,以便更好地完成此任务。
答案 1 :(得分:2)
The strcat() and strncat() functions append a copy of the null-terminated string s2 to the end of the null-terminated string s1, then add a termi- nating `\0'. The string s1 must have sufficient space to hold the result.
你正在使用它,好像它为一个新的char数组分配空间,然后填充它。但是,它没有这样做。
答案 2 :(得分:1)
问题是你的operator+
没有为组合字符串分配任何内存。它也不会将字符串复制到正确的位置(它将字符串复制到第一个,而不是复制到临时)。你的课程设计没有简单的解决方法。
答案 3 :(得分:0)
问题出在operator+
的实施上。 strcat()
将第二个参数派生的字符串追加到第一个参数指向的字符串。返回值是第一个参数。因此,从operator+
返回时,生成的S
和第一个S
参数将指向同一个缓冲区。以后会删除两次......
答案 4 :(得分:0)
检查strcat
的说明。它将第二个参数附加到
第一个,假设两个都是空终止字符串,并返回
第一个论点。在你的情况下:
它首先附加到string
成员,但没有
enoguh记忆(未定义的行为)和
它将string
中的temp
指针设置为指向相同的内存
在first
;第一个被破坏的是另一个
指向已删除的内存,以及默认分配的内存
temp
的构造函数被泄露了。
此外,您永远不会使用'\0'
终止字符串,因此strcat
可能会这样做
几乎任何事情。
更好的解决方案是首先实施+=
,然后定义+
条款。 +=
必须增加它拥有的内存,然后追加
从第二个字符串到它的文本。
虽然我在做它:你的operator=
也不起作用。它会
如果new
将对象置于无法破坏的状态
失败(抛出std::bad_alloc
)。您必须确保所有操作
在<{em> delete
之前发生失败。 (你需要的事实
测试自我分配是一个警告标志。对此非常罕见
在正确编写的赋值运算符中进行必要的测试
在这种情况下,交换习语可能是你最好的选择:复制
在局部变量中构造一个新的S
,然后交换它们的成员。