0

私は自分の文字列クラスを作成していますが、これを除いてすべて正常に動作operator +=しています:これを実行できるように演算子をオーバーロードしようとしています:

string s1 = "Hello", s2 = " World";

s1 += s2;

だからこれは私が試したものです:

// In the string class,

string& operator +=(string const& other)
{
    using std::strcpy;

    unsigned length = size() + other.size() + 1; // this->size() member
    char *temp = new char[length];               // function and a "+ 1" for the
                                                 // null byte '\0'
    strcpy(temp, buffer);
    strcpy(temp, other.data());

    delete[] buffer;

    buffer = new char[length];
    strcpy(buffer, temp);     // copy temp into buffer

    return *this;
}

しかし、私のプログラムでは、上記のメインのコードを使用すると、印刷後に出力が得られません。エラーも発生しません(実行時エラーもありません)。これはなぜですか? また、この実装を修正するにはどうすればよいですか?

注:使用できることはわかってstd::stringいますが、自分でこれを行う方法を学びたいです。

4

2 に答える 2

3

Mac's answer ののコメントに投稿したデモをざっと見ただけです。これはあなたの問題です:

string(char const *str) : buffer(new char[strlen(str)]), len(strlen(str))
{}

// ...

string s1 = "Hello";

コンストラクターでバッファーを割り当てていますが、データをバッファーにコピーすることはありません。あなただけの場合はどうなりますstd::cout << s1;か?


編集:ちなみに、他に少なくとも2つの問題があることに気付きました:

  • lenで更新していませんoperator +=
  • コピー コンストラクターは、2 つstringの s が同じバッファーを指すようにしています。これは悪いことです。他の人が使用した後に使用しようとすると爆発しdelete[]ます。
于 2013-06-12T00:48:58.767 に答える