2016-05-01 27 views
-1

私自身の "String"クラスを作成しようとしています。しかし、私は演算子+のオーバーロードに問題があります。私はオペレータ+ =を作って、うまくやって友人のオペレータ+を作って、時には私の計画通りに動かないことがあります。オーバーロード文字列演算子+

String() 
{ 
    length = 0; 
    p = new char[1]; 
    p[0] = '\0'; 
} 
String(const char*s) 
{ 
    length = strlen(s); 
    p = new char[length+1]; 
    strcpy(p, s); 
} 
String(const String& s) 
{ 
    if (this != &s) 
    { 
     length = s.length; 
     p = new char[s.length + 1]; 
     strcpy(p, s.p); 
    } 
} 
~String() 
{ 
    delete[]p; 
}; 
String &operator+=(const String&s1) 
{ 
    String temp; 
    temp.length = length + s1.length; 
    delete[]temp.p; 
    temp.p = new char[temp.length + 1]; 
    strcpy(temp.p, p); 
    strcat(temp.p, s1.p); 
    length = temp.length; 
    delete[]p; 
    p = new char[length + 1]; 
    strcpy(p, temp.p); 
    return *this; 
} 
friend String operator+(const String &s1, const String &s2) 
{ 
    String temp1(s1); 
    temp1 += s2; 
    return temp1; 
} 

私はこのようにoperator +を使用しています:String c = a + b;すべては計画どおりに動作しますが、もしa = a + bと書くと、私はエラーを取得するString.exeがブレークポイントを引き起こした。何を修正すべきですか? /////問題のオーバーロード演算子を解決しました=ありがとう!ラインで

+0

あなたはthis'と 's1'は、同じ文字列 –

+0

@EdHeal HMある私は+ = Aを使用する場合、'、私は正しい働くケースを考えがあります。 – Vladislav

+1

'temp1 + = s1;'を 'temp1 + = s2;'に変更します。 – songyuanyao

答えて

0
String operator+=(const String&s1) 
{ 
    int temp_length = length + s1.length; 
    String temp(*this); 
    length = temp_length; 
    delete[]p; 
    p = new char[length + 1]; 
    strcpy(p, temp.p); 
    strcat(p, s1.p); //<-- This is the problem 
    return *this; 
} 

friend String operator+(const String &s1, const String &s2) 
{ 
    String temp1(s1); 
    temp1 += s1; 
    return temp1; 
} 

あなたは問題があるとして記述している状況でthis.pと同じである、あなたはs1.pにアクセスしている、上記マーク。両方のパラメータに対して同じ配列のstrcatを呼び出すことは厳しく禁じられています。別のコピーを作成する必要があります。

see this answer

strcatは(3)によると:

strcatは()関数はDESTの最後に終端のNULLバイト( '\ 0')を上書きし、DESTの文字列へのsrc文字列を追加、終端ヌルバイトを追加します。 文字列はと重複しない可能性があり、dest文字列には結果に十分なスペースが必要です。

推奨する解決方法:

String operator+=(const String&s1) 
{ 
    int temp_length = length + s1.length; 
    String temp(*this); 
    length = temp_length; 
    delete[]p; 
    p = new char[length + 1]; 
    strcpy(p, temp.p); 
    if(p == s1.p) 
    { 
     String other_temp(s1.p); 
     strcat(p, other_temp); 
    } else 
     strcat(p, s1.p); //<-- no longer a problem 
    return *this; 
} 

friend String operator+(const String &s1, const String &s2) 
{ 
    String temp1(s1); 
    temp1 += s1; 
    return temp1; 
} 
+0

ありがとう!私はあなたのようにして、過負荷の演算子=。今それは正しく動作します – Vladislav

+0

答えを受け入れるか、それでも不十分であれば、それを受け入れ可能な答えと考える必要があることを私に教えてください。 – Jfevold

+0

はい、同意します。ありがとう! – Vladislav

関連する問題