-3

我创建了自己的类字符串,当我编译我的代码时它有两个属性 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

您没有遵循三的规则,下面的函数中有一个副本,这会导致崩溃。

void copy(String a)

但是,您只打算复制数据:

b.copy(a.getbuff());

您还可以将 a 的引用传递给复制函数:

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

您的主要错误是您没有重载复制构造函数。

您的课程还有其他问题,但那是您可能遇到的问题。

当您调用b.copy(a)时,该函数正在接受一个字符串by value。这意味着它会复制。

默认的复制构造函数逐个复制成员。并且您的两个成员都将具有与 相同的指针buff。两者都会尝试删除它,从而导致双重删除。

有关您的错误的更多信息,请参阅三规则

于 2013-01-04T12:12:00.197 回答