-3

独自のクラス文字列を作成しました。コードをコンパイルするときに文字列と長さを格納するための 2 つの属性 buff があり、正常に動作しませんが、文字列をオブジェクトとして使用すると、多くのエラーが発生します。エラーの理由と方法それらを防ぎますありがとう

    #include <iostream>
using namespace std;
class String
{
private:
    int length;
    char *buff;
public:

    String operator=(String &);
    String();
    String(String &);
    String(char *);
    int size(char *);
    void copy(char *);
    char getvalue(int);
    char *getbuff(){return buff;}
    void setindex(char,int);
    int getlength();
    void display();
    ~String();
};

String :: String()
{
    length = 1;
    buff = 0;
}

String :: String(String &temp)
{

    length = size(temp.buff);
    buff = new char[temp.length + 1];
    copy(temp.buff);
}

String :: String(char *a)
{
    length = size(a);
    buff = new char [length + 1];
    copy(a);
}

int String :: size(char *a)
{
    int i;
    for(i = 0;a[i] != '\0';i++)
    {
    }
    return i;
}
void String :: copy(char *a)
{
    delete []buff;
    int i;
    length = size(a);
    buff = new char[length + 1];
    for (i=0;i<length;i++)
    {
        buff[i] = a[i];
    }
    buff[i] = '\0';
}

char String :: getvalue(int index)
{
    return buff[index];
}

void String :: setindex(char value,int index)
{
    buff[index] = value;
}

int String :: getlength()
{
    return length;

}
void  String :: display()
        {
            for (int i = 0;i<length;i++)
                cout << buff[i];
        }

String :: ~String()
{
    delete []buff;
}

String String :: operator=(String &temp)
{
    copy(temp.buff);
    return *this;
}

void main()
{
    String a("r");
    String b("ee");
    b = a;
    b.display();
}
4

2 に答える 2

1

主なエラーは、コピー コンストラクターをオーバーロードしていないことです。

クラスには他にも問題がありますが、それはおそらくあなたが経験しているものです。

を呼び出しているときb.copy(a)、関数は String を受け入れていby valueます。つまり、コピーを作成します。

デフォルトのコピー コンストラクターは、メンバーごとにコピーします。そして、両方のメンバーが と同じポインターを持ちますbuff。そして、両方がこれを削除しようとするため、二重削除が発生します。

エラーの詳細については、Rule Of Threeを参照してください。

于 2013-01-04T12:12:00.197 に答える
1

3 つのルールに従わなかった場合、関数の下に 1 つのコピーがあり、クラッシュが発生します。

void copy(String a)

ただし、データのみをコピーするつもりでした:

b.copy(a.getbuff());

コピー関数の参照を渡すこともできます。

void copy(String& a);
b.copy(a); // it should be safe now
于 2013-01-04T12:15:44.377 に答える