Проблема с доморощенным методом Concat
Я реализовал свой собственный String
класс, и нужно написать Concat
метод.
Я не могу заставить это работать.
Мой код:
//the m_str is private member which is initialize in the c-tor
//this function is get a string and concat it with the original string
String &String::Concat(const char *string)
{
int original_str_size = length(m_str);
int other_str_size = length(string);
int needed_length = original_str_size + other_str_size + 1;
char *str_copy = m_str;
del();
m_str = new char[needed_length];
m_size = needed_length;
int index = 0;
for(; index < original_str_size; index++)
{
if(index < original_str_size)
m_str[index] = str_copy[index];
else
m_str[index] = string[index];
}
m_str[index] = 0;
return *this;
}
Проблема в Concat
Метод в том, что я написал что-то вроде:
String word3 = word1.Contact(word2);
Предполагается сделать word3
быть как word1+word2
но программа не удалась, когда я запустил ее.
Когда я написал:
cout << word1.Contact(word2).Length();
... он напечатал только word
1 длина вместо общей длины.
3 ответа
Давайте рассмотрим следующий код:
int index = 0;
for(; index < original_str_size; index++)
{
if(index < original_str_size)
m_str[index] = str_copy[index];
else
m_str[index] = string[index];
}
Посмотрите на ваше условие цикла, затем посмотрите на ваше условие if. Ясно, что блок else никогда не будет выполнен, и ваша строка никогда не будет объединена.
Чтобы решить эту проблему, ваше условие цикла должно быть заменено на needed_length
, Тогда вам придется заменить string[index]
с string[index - original_str_size]
чтобы получить правильный индекс в string
,
Ваш код должен выглядеть так:
int index = 0;
for(; index < needed_length; index++)
{
if(index < original_str_size)
m_str[index] = str_copy[index];
else
m_str[index] = string[index - original_str_size];
}
На заметку, что делает str_copy
указать на? Это действительная память? Сделал del()
освободить память? Возможно, хочу проверить это.
В сравнении у вас есть; после цикла for это означает, что цикл ничего не делает. Также вы возвращаете 0, когда первый символ совпадает.
В Concat вы делаете str_copy = m_str, затем, вероятно, удаляете m_str и создаете новый m_str. затем вы копируете из удаленного m_str в новый m_str, вам может повезти, но я бы на это не полагался.
В вашей функции Concat выглядит, как будто вы удаляете память, которая содержит вашу исходную строку, перед тем как скопировать строку из этой памяти в новую выделенную память.