【问题标题】:Substring method that return substring of the original返回原始子字符串的子字符串方法
【发布时间】:2012-04-30 14:58:36
【问题描述】:

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

这是我尝试在我的 .cpp 文件中实现该功能的方式:

MyString sub;

sub = new char[length];

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

return sub;

我得到了这个错误:

错误:[ 令牌之前的预期 unqualified-id MyString.cpp:206: 错误:operator[]sub[i] 中不匹配

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

我到底做错了什么?

【问题讨论】:

  • 我们可能需要先查看MyString 的定义才能提供有意义的答案。
  • this 是一个指针,所以请尝试使用this-&gt;substr 而不是this.substr
  • 了解MyString是什么吗?如果没有,那就是你的起点。我们不知道它是什么,你不告诉我们。这些错误是很容易解释的(尤其是如果你有一些好的课程笔记或一本书)
  • 您已经发布了几个问题,并且之前被建议不要返回参考。你为什么一直返回参考资料?
  • @DavidRodríguez-dribeas 我已经修复了这个错误。谢谢

标签: c++ substring


【解决方案1】:

这只是意味着 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);
}

编辑:如果我们查看您提供的代码(在上次编辑之后),您似乎实际上使用的是底层 char*。那么让我们看看你写了什么^^

MyString sub;
sub = new char[length];

您要做的实际上是修改底层 char* 的字符。所以你应该做的是:

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

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

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

        sub[i] = this[i];
}

这是一个指向 MyString 的指针。所以 this[i] 等价于 this.operator ,因为 this 是一个指针,所以它是 incalid 的。你不能在这个后面加上一个点。但是,如果您编写了 this->operator,它会搜索类似 char& 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* 作为参数的构造函数:)

【讨论】:

  • 即使MyString::substr() 存在,你仍然不能这样做。他需要this-&gt;,而不是this.
  • 是的,我的第一次尝试根本不正确,所以我必须继续第二次尝试,我将编辑我的帖子,以便您看到我到目前为止所做的事情。
  • 不要使用前导下划线,因为它们是为编译器使用而保留的。可以使用尾随下划线。
  • 如果赋值的目的是写一个子串类,那用std::string::substring()岂不是没有意义?
  • @ThomasMatthews 是的,我想是的,但他试图使用 substr 函数应该意味着可能存在一个底层 std::string 类,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 2020-02-08
  • 2016-11-20
  • 1970-01-01
相关资源
最近更新 更多