0

location で始まり、ある長さSubstring()の元の文字列の部分文字列を返すメソッドを作成するように依頼されました。startlength

.cpp ファイルに関数を実装しようとした方法は次のとおりです。

MyString sub;

sub = new char[length];

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

return sub;

そして、私はこのエラーを受け取りました:

[エラー:トークン MyString.cpp:206の前に unqualified-id が必要です: エラー: operator[]in に一致しませんsub[i]

注: [] をオーバーロードすることは想定されていません。MyString は定義されたクラスです。

私は正確に何を間違っていますか?

4

1 に答える 1

0

これは単に 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* をパラメーターとして取るコンストラクターがあることが前提です:)

于 2012-04-30T15:02:54.513 に答える