Для начала функция append имеет утечку памяти, поскольку предыдущий указатель не удален. И новое значение элемента данных len
не установлено.
void append(const String& s){
char* temp;
temp = new char[len+s.len];
for(int i = 0; i < len; i++){
temp[i] = str[i];
}
for(int i = 0; i < s.len; i++){
temp[len + 1] = s.str[i];
}
str = temp;
}
Во втором l oop
for(int i = 0; i < s.len; i++){
temp[len + 1] = s.str[i];
}
есть опечатка. Вы имеете в виду
temp[len + i] = s.str[i];
^^^
В-третьих, вы выводите строку как C string
cout << s.str << endl
Это означает, что указанная строка должна иметь завершающий нулевой символ.
Элементы данных str
и len
должны быть частными элементами данных. И элемент данных len
должен иметь тип size_t
.
char* str = nullptr;
unsigned int len = 0;
Более того, в циклах вы используете индекс типа int
вместо типа unsigned int
.
Так что на самом деле определение класса в целом неверно.
Что касается функции append, то она должна быть определена как минимум следующим образом. Я предполагаю, что указанные массивы содержат строки.
String & append( const String &s )
{
char* temp = new char[len + s.len + 1];
size_t i = 0;
for ( ; i < len; i++ ) temp[i] = str[i];
while ( ( temp[i] = s.str[i-len] ) != '\0' ) i++;
delete [] str;
str = temp;
len = len + s.len;
return *this;
}
Обратите внимание, что конструктор по умолчанию должен выделить память размером 1
и установить выделенный байт на '\0'
. В этом случае элемент данных len
должен быть установлен на 0
.
Поэтому проверьте все остальные функции-члены. Например, функция-член find
будет иметь неопределенное поведение, когда переданная строка имеет элемент данных len
, равный 0
.