これは単に this.substr() が有効な C++ ではないことを意味します。これは現在のオブジェクトへのポインタです。したがって、メソッド MyString::substr() が存在しない限り、それはできません。
そこから始めて、あなたの MyString クラスにどのメンバーがいるかわかりません。std::string がある場合は、substr メソッドを使用できます。基になるメンバーが単なる char* である場合、単純な配列および c-string 操作を使用して、そこからサブストリングを抽出する必要があります。
例を挙げます。あなたのクラスがこのようなものであれば
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];
したがって、新しい MyString を作成する代わりに、新しい char* を作成します。char* を MyString に直接割り当てることはできません (少なくとも、それは私が考えていることです)。それでは、コードの他の部分を見てみましょう。
for(int i = start; i <length; i++)
{
sub[i] = this[i];
}
これは MyString へのポインタです。したがって、this[i] は this.operator と同等であり、これはポインターであるため incalid です。この後にドットを続けることはできません。ただし、この->operator と書いた場合、char& MyString::operator[](int i) のような関数を検索します。この関数を定義していないため、コンパイラ エラーが発生します (sub を MyString として定義したため、sub[i] に対して現在発生しているエラーでもあります。次のように記述する必要があります。
for (int i = start; i < length; i++)
{
sub[i] = _str[i];
}
ただし、 _str がクラス内の char* であることが引き続き提供されます。次に、次の方法で関数を終了できます。
return MyString(sub);
しかし、そこには、 MyString クラスに char* をパラメーターとして取るコンストラクターがあることが前提です:)