C++ 返回原始字符串的子字符串的Substring方法

C++ 返回原始字符串的子字符串的Substring方法,c++,substring,C++,Substring,我被要求创建一个Substring方法,该方法返回原始字符串的一个子字符串,该字符串从位置start开始,长度与长度相同 下面是我如何尝试在.cpp文件中实现该函数的: MyString sub; sub = new char[length]; for(int i = start; i <length; i++) { sub[i] = this[i]; } return sub; 我得到了这个错误: 错误:在[token]之前应为非限定id MyString.cpp:206

我被要求创建一个Substring方法,该方法返回原始字符串的一个子字符串,该字符串从位置start开始,长度与长度相同

下面是我如何尝试在.cpp文件中实现该函数的:

MyString sub;

sub = new char[length];

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

return sub;
我得到了这个错误:

错误:在[token]之前应为非限定id MyString.cpp:206:错误:子[i]中的运算符[]不匹配

注意:我不应该超载[]。 MyString是已定义的类


<>我到底做错了什么?

它只是表示这个.SUBL不是有效的C++。 这是指向当前对象的指针。因此,除非方法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;
};
那么您的子字符串方法将如下所示:

MyString MyString::Substring(int start, int length) const
{
    return MyString(_str.substr(start, length));
}
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是这样的:

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
{
    return MyString(_str.substr(start, length));
}
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];
因此,您将创建一个新的char*,而不是创建一个新的MyString。您不能直接将char*分配给MyString,至少我是这么认为的。现在,让我们看看代码的另一部分:

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

        sub[i] = this[i];
}

但是在这里,你的MyString类有一个构造函数,它以char*作为参数:

我们可能需要先查看MyString的定义,然后才能提供有意义的答案。这是一个指针,所以试着用这个->substr代替它。substr你知道MyString是什么吗?如果不知道,那就是你的起点。我们不知道I don’我不知道是什么,你不告诉我们。这些错误是不言而喻的,尤其是如果你有一些好的课程笔记或一本书,你已经发布了一些问题,并且之前有人建议你不要返回参考资料。为什么你一直在返回参考资料?@DavidRodríguez dribeas我已经纠正了这个错误。如果我的文章::substr存在,您仍然无法执行此操作。他需要此->,而不是此..是的,我的第一次尝试根本不正确,因此我必须继续进行第二次尝试,我将编辑我的帖子,以便您可以看到我迄今为止所做的操作。不希望使用前导下划线,因为它们是为编译器使用而保留的。可以使用尾随下划线。如果目标是如果任务是写一个子字符串类,那么使用std::string::substring不是毫无意义吗?@ThomasMatthews是的,我想是的,但是他试图使用substr函数应该意味着可能有一个底层std::string类,对吧?