c++中string的重载*操作符
Overloading * operator for string in C++
我需要使用这个(*)运算符乘以一个字符串x次。例如:
String a = "First";
String b = a*2; // then b = "FirstFirst"
但是它崩溃了。最奇怪的是,它有时会崩溃。有几次它可以工作,然后崩溃。
这是我的string-class
class String {
int len;
char *str;
public:
String () {
len = 0;
str = NULL;
}
String(const char *);
String(const String &);
~String() {
delete [] str;
}
String operator++(int notused);
String & operator =(const String &);
friend int operator == (const String &, const String &);
friend ostream & operator <<(ostream &, const String &);
friend istream & operator >>(istream &, const String &);
friend String operator*(const String & s1, int x);
friend String operator*(int x, const String & s1);
};
这里是*操作符和一些构造函数的重载:
String::String(const char * ptr)
{
str = new char [(len = strlen(ptr)) + 1];
strcpy(str, ptr);
}
String::String(const String & s)
{
str = NULL;
if(len = s.len){
str = new char [len + 1];
strcpy(str, s.str);
}
}
String operator*(const String & s1, int x)
{
String result = s1;
result.str = new char[(s1.len)*x];
strcpy (result.str, s1.str);
result.len = x*s1.len;;
for (int i = 0; i < (x-1); i++)
{
strcat (result.str, s1.str);
}
return result;
}
首先我检查了字符串的长度。但我认为他们还好,那有什么问题吗?
因此,我用以下行分配了新的内存:
String result = s1;
result.str = new char[(s1.len)*x];
对于0到7的数字,它可以完美地工作。8点就崩溃了。大小是关键。如果我用double-X乘以:
result.str = new char[(s1.len)*x*x];
然后我可以穿过8-barrier。有时我看到bad_alloc错误
这个问题是因为你没有在operator*
中分配新的内存
strcpy
和strcat
假设字符数组足够大,可以包含结果字符串。
您应该分配足够的内存,以便在构造函数中完成