1

プライベートフィールドとしてchar*を持つStringという単純なクラスがあります。

class String {
      char *s;
+ some public methods
};

+演算子をオーバーロードしたいので、a + bは、aとbの文字列が連結されることを意味します。

関数はここにあります:

String String::operator+(String a)
{
    String rez;
    rez.s = new char[strlen(this->s) + strlen(a.s) + 1];
    assert(rez.s);
    strcpy(rez.s, this->s);
    strcat(rez.s, a.s);
    cout<<rez.s<<endl; // HERE rez.s CONTAINS THE RIGHT STRING!
    return rez;
}

私がこれを呼んだ後:c = a + b;

デバッグアサーションに失敗したというエラーが表示されます。

何か案は?

4

1 に答える 1

1

まず、三つのルールを読んでください

次に、これを検討します。

class String {
      char *s;   // << pointer
+ some public methods
};

「+一部のパブリックメソッド」には、ポインターメンバーをテスト可能な値(NULLなど)に初期化するコンストラクターが含まれている方が適切です。そうでない場合は、未定義の動作に慣れています。あるStringオブジェクトから別のStringオブジェクトに文字列を適切に複製するには、コピーコンストラクターと代入演算子をオーバーライドする方が適切です。最後に、上記のすべてで割り当てられたコンテンツへの動的ポインターをクリーンアップする方法を知っているデストラクタが必要です。

その記事を前後に読むことを強くお勧めします。

于 2012-11-07T20:43:33.783 に答える