В коде много ошибок, поэтому я не знаю, с чего начать, но я полагаю, что в общем случае дать вам несколько советов, которые помогут вам понять ваш код, будет в порядке.
По моему мнению, вам не нужно иметь индекс размера в классе String, так как есть функция strlen (), которая с радостью вычислит его для вас.
Теперь для объявления вашего класса проверьте, как вы объявляете указатель, который будет содержать строку для вас. Вам нужно сделать это, как показано ниже:
class MyString1
{
private:
char* chars;//this declares a pointer to a char that will hold the string for you
public:
...
Также вы никогда не выделяете символ *, содержащий строки. Ваш конструктор должен быть:
MyString1::MyString1(const char* chars)
{
this->chars = (char*) malloc(strlen(chars)+1); //this will allocate an array of strlen() chars +1
strcpy(this->chars,chars);
}
Как видите, я не использую индекс размера, поскольку strlen может довольно эффективно это выяснить для вас. +1 для '\ 0', обозначающего конец строки.
Теперь, чтобы добавить что-то к строке, это будет сложно.
void MyString1::append(const MyString1& s) //it's good to give a constant reference to the string here
{
//first of all we gotta reallocate the pointer,since we don't have enough memory for the string
int newsize = strlen(this->chars) + strlen(s)+1;
this->chars = (char*) realloc(this->chars,newSize); \\ no check for realloc failure, I know but this is just an example
strcat(this->chars,s.chars);
}
Вам не нужно ничего возвращать при добавлении. Вы делаете что-то с этой строкой.
Ваша :: at () функция почти в порядке. Представьте себе, однако, что произойдет, если размер строки будет 10 и вы запросите MyString1 :: at (12). Это может вызвать ошибку сегментации (это нехорошо).
Так что вы должны изменить свой код для проверки границ, как показано ниже:
char MyString1::at(int index)
{
//if it's out of bounds let's return -1 which will signify that we got an out of bounds value (could also throw an exception here but that's a different subject altogether)
if(index > strlen(this->chars) || index <0)
return -1;
return chars[index];
}
Также в C / C ++ вы должны освободить выделенную память. Таким образом, для этого вы должны объявить нечто, называемое деструктор
MyString1::~MyString1()
{
free(this->chars);
}
Наконец, пустая функция может быть такой:
bool MyString1::empty()
{
return (this->chars[0] == '\0';
}