它只是意味着 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);
But there, it's provided that your MyString class has a constructor that takes a char* as a parameter :)