Метод подстроки, возвращающий подстроку оригинала

Меня просят создатьSubstring() метод, который возвращает подстроку исходной строки, которая начинается в местоположенииstart и так долго, какlength

Вот как я пытался реализовать эту функцию в моем файле .cpp:

<code>MyString sub;

sub = new char[length];

for(int i = start; i <length; i++)
{
    sub[i] = this[i];
}

return sub;
</code>

и я получил эту ошибку:

error: expected unqualified-id before [ token MyString.cpp:206: error: no match for operator[] in sub[i]

Примечание: я не должен перегружать []. MyString - это определенный класс.

Что именно я делаю не так?

Ответы на вопрос(1)

это указатель на текущий объект. Поэтому, если метод MyString :: substr () не существует, вы не можете этого сделать.

Исходя из этого, я не знаю, какие члены есть в вашем классе MyString. Если есть std :: string, вы можете использовать метод substr. Если базовый член - просто char *, вам придется использовать простые операции над массивом и c-строкой для извлечения из него подстроки.

С примером. Если ваш класс такой

class MyString
{
    private:
        std::string _str;

    public:
        // Constructor
        MyString(std::string str);
        // Your method
        MyString Substring(int start, int length) const;
};

Тогда ваш метод Substring будет выглядеть так:

MyString MyString::Substring(int start, int length) const
{
    return MyString(_str.substr(start, length));
}

С другой стороны, если ваш класс MyString такой:

class MyString
{
    private:
        char* _str;

    public:
        // Constructor
        MyString(char* str);
        // Your method
        MyString Substring(int start, int length) const;
};

Тогда ваш метод будет таким:

MyString MyString::Substring(int start, int length) const
{
    char* res_str = new char[length+1];
    memcpy(res_str, (char*) _str + start, length);
    res_str[length] = '\0';
    return MyString(res_str);
}

РЕДАКТИРОВАТЬ: Если мы посмотрим на код, который вы предоставили (после последнего редактирования), кажется, что вы на самом деле используете базовый символ *. Итак, давайте посмотрим, что вы написали ^^

MyString sub;
sub = new char[length];

То, что вы хотите сделать, это на самом деле изменить символы основного символа *. Итак, что вы должны были сделать, это:

char* sub;
sub = new char[length];

Таким образом, вместо создания новой MyString, вы создадите новый символ *. Вы не можете напрямую назначать char * для MyString (или, по крайней мере, это то, что я думаю). Теперь давайте посмотрим на другую часть вашего кода:

for(int i = start; i <length; i++)
{

        sub[i] = this[i];
}

это указатель на MyString. Так что this [i] эквивалентен this.operator, который недействителен, так как это указатель. Вы не можете иметь это после точки. Однако, если бы вы написали оператор this-> gt ;, он бы искал такую функцию, как char & amp; MyString :: operator [] (int i). Поскольку вы не определили эту функцию, у вас все равно будет ошибка компилятора (она также есть у вас в настоящее время для sub [i], так как вы определили sub как MyString. Вы должны написать:

for (int i = start; i < length; i++)
{
    sub[i] = _str[i];
}

Но это все еще при условии, что _str является символом * в вашем классе. Тогда вы сможете завершить свою функцию:

return MyString(sub);

Но там, при условии, что ваш класс MyString имеет конструктор, который принимает char * в качестве параметра :)

ВАШ ОТВЕТ НА ВОПРОС