Здесь я написал 2 перегруженных оператора:
stringb operator+(const stringb &a,const stringb &b)
{
stringb temp;
temp.len = a.len + b.len;
temp.p=new char[(temp.len)+1];
strcpy(temp.p, a.p);
strcat(temp.p, b.p);
return (temp);
}
stringb operator-(const stringb &a,const stringb &b)
{
stringb temp;
temp.len=a.len-b.len;
temp.p=new char[temp.len+1];
strcpy(temp.p,a.p);
return (temp);
}
Однако, когда я компилирую фактический код, весь код работает, за исключением части, когда я вызываю этот оператор, и я получаю мусор из put. Что не так с моими функциями?
EDIT: Объявление класса stringb:
class stringb
{
public:
char *p;
int len;
public:
stringb()
{
len=0;
p=0;
}
stringb(const char *s)
{
len=strlen(s);
p=new char[len+1];
strcpy(p,s);
}
stringb(const stringb &s)
{
len=s.len;//strlen(s);
p=new char[len+1];
strcpy(p,s.p);
}
~stringb()
{
delete p;
}
friend int operator==(const stringb &a,const stringb &b);
friend stringb operator+(const stringb &a,const stringb &b);
friend stringb operator-(const stringb &a,const stringb &b);
friend void putstring(const stringb a);
};
Ваша проблема здесь:
~stringb()
{
delete p; // <<<<<
}
Это будет выполнено, если temp
выходит за пределы области определения вашего оператора.
Чтобы заставить ваш код работать, вам нужна правильная реализация правила 3 в вашем классе stringb
. Вы также можете посмотреть этот хороший IDE один образец, P0W имеет настройку из вашего кода.
stringb
Попробуйте вернуть ссылку:
stringb& operator+(const stringb &a, const stringb &b);
{
stringb *temp = new stringb();
temp->len = a.len + b.len;
[...]
return *(temp);
}
stringb *temp = new stringb; temp->len = a.len - b.len; temp->p=new char[temp->len+1]; strcpy(temp->p,ap); return *(temp);
Все еще падает.
stringb
пожалуйстаstringb
, не могли бы вы показать это, пожалуйста!