2

手順は次のとおりです。

MyStringオブジェクトは、次の演算子をオーバーロードする必要があります。

1)前の割り当てのSet関数とGet関数を置き換えるには、括弧演算子をオーバーロードする必要があります。文字列配列の境界に違反すると、両方のインスタンスがexit(1)を発行する必要があることに注意してください。

関数が定義されている私の.cppファイル:

 // My original set function to replace the character at the index passed in with the character passed in

 void MyString::Set(int index, char b)
 {
    if(String[index] == '\0')
    {
            exit(1);
    }
    else
    {

            String[index] = b;
    }


 }
 //original get function to get the character of the index passed in as argument
 char MyString::Get(int i)
 {

    if( String[i] == '\0')
    {
            exit(1);
    }
    else
    {
            return String[i];

    }
 }

これをオーバーロードされた()演算子関数に変換するにはどうすればよいですか?私が得たものの中で最も多いものは次のとおりです。

 MyString& MyString::operator()(const int index, const char b)
 {
    if(String[index] == '\0')
    {
            exit(1);
    }
    else
    {

            String[index] = b;
    }


}


char& MyString::operator()(const int i)
{

    if( String[i] == '\0')
    {
            exit(1);
    }
    else
    {
            return String[i];

    }
}

私は何が間違っているのですか?

4

2 に答える 2

3

境界チェックは間違っていますが、元のコードではすでにその問題が発生しています。

あなたのindexパラメータは不思議なことにタイプをからintに変更しましたconst MyString&、それは間違っているように見えます。

于 2012-04-28T20:10:34.020 に答える
2

GetとSetの両方、および()演算子の2つのオーバーロードは、不適切な(間違った!)方法で文字列外エラーをチェックします。文字列の長さがそれほど長くない場合、文字列のi番目またはn番目の要素を「\0」にすることはできません。現在の文字列の長さを超えてメモリを読み取ろうとすると、読み取りアクセス違反が発生する可能性があります。

代わりに、指定されたインデックスが文字列の長さよりも短いかどうかを確認し、そうである場合は要素を返す必要があります。それ以外の場合は、範囲外です。

もう1つのことは、()演算子の最初のオーバーロードで、文字列オブジェクトを使用して文字列配列を逆参照していることです。これはあまり意味がありません。また、要素を1つだけ設定しているため、bは文字列ではなく、文字である必要があります。

于 2012-04-28T20:13:42.457 に答える