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

时间:2012-04-30 14:58:37

标签: c++ substring

我被要求创建一个Substring()方法,该方法返回原始字符串的子字符串,该字符串从位置start开始,并且与length

一样长

以下是我尝试在.cpp文件中实现该功能的方法:

MyString sub;

sub = new char[length];

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

return sub;

我收到了这个错误:

  

错误:[令牌之前的预期非限定ID   MyString.cpp:206:错误:operator[]

中的sub[i]不匹配

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

我究竟做错了什么?

1 个答案:

答案 0 :(得分:0)

它只是意味着this.substr()不是有效的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;
};

然后你的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];

因此,您将创建一个新的char *,而不是创建新的MyString。你不能直接将一个char *分配给MyString(或者至少,它是我的想法)。现在,让我们看一下代码的另一部分:

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

        sub[i] = this[i];
}

这是一个指向MyString的指针。所以这个[i]等同于this.operator,因为这是一个指针,所以它是愚蠢的。你不能得到一个点后跟。但是,如果你编写了这个&gt;运算符,它就会搜索像char和amp;这样的函数。 MyString :: operator [](int i)。由于你没有定义这个函数,你仍然会有一个编译器错误(它也是你现在为sub [i]所拥有的错误,因为你将sub定义为MyString。你应该写:

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

但仍然提供_str是你班上的一个char *。然后,您将能够通过以下方式完成您的功能:

return MyString(sub);

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