1

自分で文字列クラスを書いています。+ 演算子をオーバーロードしました。正常に動作しますが、評価しようとしましcstr = str +pop たが、何もしませんでした。`main() 関数で私のエラーを確認できます。コンパイラは間違いをしません。

#include <iostream>
#include <string.h>
#include <stdlib.h>

using namespace std;

class S {

public:
          S();
          S(const char *str);
          S(const S &s);

         ~S() { delete []string;}
          S  &operator  =(const S   &s);

          int  lenght() const {return l     ;}
      char*  strS() const {return string;}

      friend ostream &operator <<(ostream &, const S &first) {cout<<first.string;}
      friend S    operator+ (const S& first, const S& second);

private:
          char *string;
          int l;

};

int main(){
S pop("Q6");
S str("M5");

S cstr = str +pop; // works correct
cout<<str;

str = str + pop;
cout<<str ;        // doesnt work, it doesnt write in terminal

return 0;
}
S::S()
{
    l = 0;
    string = new char[1];
    string[0]='\0';
}

S::S(const char *str)
{
    l      = strlen(str);
    string = new   char[l+1];
    memcpy(string, str, l+1);
}

S::S(const S &s)
{
     l = s.l;
     string = new char[l+1];
     memcpy(string,s.string,l+1);
}

S &S::operator=(const S &s)
{
    if (this != &s)
    {
        delete []string;
        string = new char[s.l+1];
        memcpy(string,s.string,s.l+1);
        return *this;
    }
    return *this;
}

S    operator +(const S& first, const S& second)

{
    S temp;
    temp.string = strcat(first.strS(),second.strS());
    temp.l      = first.lenght() + second.lenght();

  return temp;
 }

私はあなたの助けを楽しみにしています。

4

5 に答える 5

2

strcat のマンページから:

 The strcat() and strncat() functions append a copy of the null-terminated
 string s2 to the end of the null-terminated string s1, then add a termi-
 nating `\0'.  The string s1 must have sufficient space to hold the
 result.

新しいchar配列にスペースを割り当ててから、それを埋めるかのように使用しています。しかし、それはしません。

于 2012-10-12T13:02:57.547 に答える
1

問題はoperator+、結合された文字列にメモリが割り当てられていないことです。また、文字列を適切な場所にコピーしません (文字列を temp ではなく最初にコピーします)。あなたが持っているクラス設計を簡単に修正することはできません。

于 2012-10-12T13:04:04.863 に答える
0

の説明を確認してくださいstrcat。両方とも null で終了する文字列であると仮定して、2 番目の引数を最初の引数に追加し、最初の引数を返します。あなたの場合:

  • firstのメンバーに追加されstringますが、十分なメモリがありません (未定義の動作)。

  • のポインターと同じメモリーを指すようにstringポインターを設定します。最初に破壊されるものは、削除されたメモリを指している他のものを残し、デフォルトのコンストラクタで割り当てられたメモリがリークされます。tempfirsttemp

また、文字列を'\0'で終了することは決してないので、strcatほぼ何でもできます。

より良い解決策は+=、最初に実装+し、それに関して定義することです。 +=持っているメモリを増やし、2番目の文字列からテキストを追加する必要があります。

そして、私がそれに取り組んでいる間、あなたもうまくいきoperator=ません。new 失敗した場合(スロー) 、オブジェクトを破壊できない状態のままにしますstd::bad_alloc。失敗する可能性のあるすべての操作がのに発生するようにする必要がありdeleteます。(自己代入をテストする必要があるという事実は、警告サインです。正しく書かれた代入演算子でこのテストが必要になることは非常にまれです。) この場合、おそらく swap イディオムが最善の策でしょう: newSをローカル変数に入れ、それらのメンバーを交換します。

于 2012-10-12T13:12:26.307 に答える
0

問題は、の実装にありoperator+ます。strcat()2 番目の引数が指す文字列を、最初の引数が指す文字列に追加します。戻り値は最初の引数です。operator+したがって、結果から戻るSと、最初のS引数は同じバッファーを指します。これは後で2回削除されます...

于 2012-10-12T13:03:51.413 に答える