0

2 つの文字列を連結するために演算子のオーバーロードを実装しようとしましたが、組み込みの文字列関数を使用せず、ポインターを使用しませんでした。コードは次のとおりです。

#include<iostream>
using namespace std;
class str
{
    public:
    char* name;
    str* operator+(str obj)
    {
        str obj3;
        while(*name)
        {
            obj3.name = name++;
            obj3.name++;
        }
        while(*obj.name)
        {
            obj3.name = obj.name++;
            obj3.name++;
        }
        *(obj3.name) = '\0';
        return &obj3;
    }
};

int main()
{
    str str1,str2;
    str* str3;
    str1.name = "hello";
    str2.name = " there!";
    str3 = str1+str2;
    cout<<"the output is: "<<str3.name;
    return 0;
}

私は多くの変更を試みましたが、成功しませんでした。私がオンラインで見つけたすべてのソリューションは、組み込みの文字列関数に基づいていました。

4

1 に答える 1

3

さて、すぐに目立つものは次のとおりです。

  • メンバーの明確な所有権はありませんname-あなたの場合、いくつかの文字列リテラルに設定しますが、それを ? で割り当てるとどうなりますnewか? では、破壊の責任は誰にあるのでしょうか。所有者は誰ですか?
  • operator+strではなくへのポインタを返すstrため、str3 = str1+str2;無効です。
  • str obj3;メンバーが初期化されることはありませんが、未定義の動作である書き込みを試みます。
  • 値を渡すとコピーが作成されますが、これは 3 のルールに従わない場合には良くありません。この場合、必要かどうかさえ明確ではありません。
于 2013-03-10T17:56:58.487 に答える