Проблема с доморощенным методом Concat - PullRequest
0 голосов
/ 24 мая 2011

Я реализовал свой собственный класс 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 ]

1 голос
/ 25 мая 2011

Давайте рассмотрим следующий код:

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() освободил память? Возможно, захочу это проверить.

0 голосов
/ 24 мая 2011

В вашей функции Concat выглядит, как будто вы удаляете память, в которой находится исходная строка, перед тем как скопировать строку из этой памяти в недавно выделенную память.

0 голосов
/ 24 мая 2011

В сравнении у вас есть;после цикла for это означает, что цикл ничего не делает.Также вы возвращаете 0, когда совпадает первый символ.

В Concat вы делаете str_copy = m_str, затем, вероятно, удаляете m_str и создаете новый m_str.затем вы копируете из удаленного m_str в новый m_str, вам может повезти, но я бы не стал на это полагаться.

...