4

C++11 で独自の文字列クラスを作成しようとしていますが、いくつか問題があります。私のクラスを std::string クラスと比較すると、

std::string.at(int) = 'a'; メソッド/オーバーロード。

私は自分のクラスで at(int) メソッドを作成しました:

int at(int index)
{
    if(index <0 || index > size-1) {throw std::out_of_range("Error, index out of range");}
    return data[index];
}

そして、私が使用するだけでうまくいきました:

MyString.at(2);

メインファイルで:

MyString = "Hello world!"; //Works fine!
MyString.at(2)='a'; //Gives, Error: expressino must be a modifiable Ivalue.

これについての助けは素晴らしいでしょう、ありがとう!

4

2 に答える 2

3

メンバー関数の少なくとも 1 つがat()への非 const 参照を返す必要がありますchar。このような:

char &at(std::size_t idx)
{
    return data[idx];
}

const関数のバージョンも定義すると便利です。

const char &at(std::size_t idx) const
{
    return data[idx];
}

std::size_t(任意のサイズを表すのに十分な大きさであることが保証されている符号なし型)の使用にも注意してください。このようにして、移植性が向上し、負のインデックスをチェックする必要がなくなります。

于 2013-10-19T21:33:33.113 に答える
1

文字への参照ではなく整数を返しています。おそらく次のようにします。

char& at(int index)

もちろん、正しい文字型を返す必要がありますが、呼び出し元が割り当てられるようにするには、いずれにしても参照を返す必要があります。

于 2013-10-19T21:33:02.517 に答える